numpy中的快速行删除

时间:2017-11-15 03:34:24

标签: python numpy row

我正在处理一个大的numpy矩阵(大约75k行,每行2个整数),我必须从中删除一些行。我想知道是否有一种快速的方法来删除一行而不重新生成整个数组,即是否有一个函数只需改变"掩码" (或任何被称为)矩阵,没有有效删除内存中的行?然后,在删除所有正确的行后,我可以重新生成一个干净的矩阵。

2 个答案:

答案 0 :(得分:2)

虽然masked arrays是一个东西,但我可能会使用一个单独的布尔掩码,例如。

big_array = np.random.rand(75000, 2)

rows_to_delete = np.random.randint(0, 75000, 500)
mask = np.ones(75000, dtype=bool)
mask[rows_to_delete] = False

output = big_array[mask]
print(output.shape)
# (74503, 2)

如果你只有一个要删除的索引列表,np.delete函数也是一个选项:

output = np.delete(big_array, rows_to_delete, axis=0)
print(output.shape)
# (74503, 2)

请注意,在其中任何一个选项中,都是返回的新数组,而不是原始数组的视图。

答案 1 :(得分:1)

从数组中选择行的快速方法是使用切片生成view。但这需要一个像'every-nth'行那样的常规模式。任何其他选择都会产生副本。

x[::10,:]   # view
x[[1,3,6,10,20],:]   # copy
x[[True,False,False,True,False,...],:]   # copy

np.delete允许您指定要删除的行,但最终会生成一个或另一个行,从而生成包含其余行的副本。根据您指定的内容,它是使用不同方法的复杂函数。但在许多情况下,它构建了一个掩码,如@jakevdp所示。

因此删除一堆行的最快方法是一次删除它们(或选择它们的补码)。一次删除一个是缓慢的方式。