8

给定一个大型 2d numpy 数组,我想删除一系列行,比如10000:10010有效地删除行。我必须在不同的范围内多次执行此操作,因此我也想使其可并行化。

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

有任何想法吗?

4

3 回答 3

3

由于定义了一个 numpy 数组的跨步数据结构,如果不使用掩码数组,您想要的将是不可能的。您最好的选择可能是使用屏蔽数组(或者您自己的布尔数组)来屏蔽已删除的行,然后delete对所有要删除的行进行一次实际操作,然后再将其传递到下游。

于 2013-11-01T02:35:17.170 回答
2

正如您已经提到的那样,没有真正的加速删除操作的好方法,这种删除需要将数据复制到内存中。正如@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 也无济于事。

于 2013-11-01T02:51:33.480 回答
0

相对于上述内容,我不知道这有多快,但是假设您有一个 L 列表,其中包含您希望从数组 A 中保留的行的行索引(“行”是指第一个索引,用于更高维数组)。所有其他行将被删除。我们将让 A 保留结果。

A = A[np.ix_(L)]
于 2016-07-17T23:36:56.923 回答