将同一个numpy数组的两个视图组合成单个视图而不复制数组?

时间:2018-05-14 12:17:23

标签: python numpy view slice

我有一个大的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)

但没有复制。这可能吗?

2 个答案:

答案 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