给定一个大的2d numpy数组,我想删除一系列行,有效地说行10000:10010
。我必须使用不同的范围多次这样做,所以我也希望它可以并行化。
使用像numpy.delete()
这样的东西效率不高,因为它需要复制数组,花费太多时间和内存。理想情况下,我想做一些像创建视图的东西,但我不知道在这种情况下我怎么做。掩码数组也不是一个选项,因为掩码数组不支持下游操作。
有什么想法吗?
答案 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)