如何有效地从大型numpy数组中删除一系列行?

2024-10-01 17:21:46 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个大的2dnumpy数组,我想高效地删除一系列行,比如rows10000:10010。我必须在不同的范围内多次这样做,所以我也希望它可以并行化。在

使用numpy.delete()这样的方法效率不高,因为它需要复制数组,占用太多时间和内存。理想情况下,我会想做一些事情,比如创建一个视图,但是我不确定在这种情况下我该怎么做。掩码数组也不是一个选项,因为掩码数组不支持下游操作。在

有什么想法吗?在


Tags: 方法内存numpy视图选项时间情况数组
3条回答

我不知道这有多快,相对于上面的内容,但是假设您有一个列L的行索引,您希望从数组a中保留这些行(对于高维数组,“rows”是指第一个索引)。所有其他行都将被删除。我们让A来决定结果。在

A = A[np.ix_(L)]

实际上没有一个好的方法来加速删除操作,正如您已经提到的,这种删除需要将数据复制到内存中。正如@WarrenWeckesser建议的那样,您可以做的一件事是组合多个删除操作,并一次应用它们。下面是一个例子:

ranges = [(10, 20), (25, 30), (50, 100)]
mask = np.ones(len(array), dtype=bool)

# Update the mask with all the rows you want to delete
for start, end in ranges:
    mask[start:stop] = False

# Apply all the changes at once
new_array = array[mask]

并行化这个并没有什么意义,因为你只是在内存中复制一些东西,所以无论如何这都是内存限制的,增加更多的CPU也无济于事。在

由于定义numpy数组的跨接数据结构,如果不使用掩码数组,您将无法实现所需的功能。您最好的选择可能是使用一个屏蔽数组(或者您自己的布尔数组)来屏蔽删除的行,然后对所有要删除的行执行一次实数delete操作,然后再将其传递给下游。在

相关问题 更多 >

    热门问题