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

时间:2013-11-01 02:07:50

标签: python numpy

给定一个大的2d numpy数组,我想删除一系列行,有效地说行10000:10010。我必须使用不同的范围多次这样做,所以我也希望它可以并行化。

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

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

由于strided数据结构定义了numpy数组,因此如果不使用屏蔽数组,将无法实现所需。您最好的选择可能是使用屏蔽数组(或者您自己的布尔数组)来屏蔽已删除的行,然后在向下游传递之前对要删除的所有行执行单个实际delete操作。 / p>

答案 1 :(得分: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]

将它并行化是没有意义的,因为你只是在内存中复制内容,所以这将是内存绑定,添加更多cpus无济于事。

答案 2 :(得分:0)

相对于上面的内容,我不知道这有多快,但是你说你有一个你希望从数组A中保留的行的行索引列表L(通过"行"我的意思是第一个索引,对于更高维度的数组)。所有其他行都将被删除。我们让A持有结果。

for name in open(r'C:\names.txt', 'r'):
    print('Name: ',name, 'Email: ',email)