我有一个大的2d numpy数组,我想删除它的子集并处理剩下的函数。我需要为许多子集执行此操作,因此我理想情况下不希望每次都创建数组的副本。该函数不会更改数组中的任何值。
mat = np.load(filename)
mat_1 = mat[:i,:]
mat_2 = mat[j:,:]
到目前为止,mat_1和mat_2是视图。 然后我想做
mat_s = np.concatenate((mat_1,mat_2))
result = func(mat_s)
但没有复制。这可能吗?
答案 0 :(得分:1)
由于只能使用一组固定的strides
创建内存视图,因此您必须在案例中创建一个副本,其中mat.shape[0] > j > i
。
这意味着只有在想要查看数组中每个第x个元素的视图时,视图才有效:
mat = np.arange(20)
view = mat[slice(0, 20, 4)]
view
# Out[41]: array([ 0, 4, 8, 12, 16])
因此,这仅适用于等距单元格的视图。但是,如果您希望查看一个连续的slice(0, i)
和另一个连续的slice(j, mat.shape[0])
,那么它将无法正常工作。你必须要复制一份。
答案 1 :(得分:-1)
您可以删除要删除的行,并将其直接传递到函数
mat = np.load(filename)
mat_s = np.delete(mat,list(range(i,j)),axis=0)
您可以通过添加范围列表(例如
)来删除2个差异子集mat_s = np.delete(mat,list(range(i,j))+list(range(k,l)),axis=0)
以上删除了行i:j和k:l