我正在处理一个大的numpy矩阵(大约75k行,每行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所示。
因此删除一堆行的最快方法是一次删除它们(或选择它们的补码)。一次删除一个是缓慢的方式。