Python 在不复制阵列的情况下将同一numpy阵列的两个视图合并到单个视图中?

Python 在不复制阵列的情况下将同一numpy阵列的两个视图合并到单个视图中?,python,numpy,view,slice,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) 但是没有复制。这可能吗?您可以删除要

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

但是没有复制。这可能吗?

您可以删除要删除的行,并将其直接传递到函数中

mat = np.load(filename)
mat_s = np.delete(mat,list(range(i,j)),axis=0)
通过添加范围列表,可以删除2个diff子集,如

mat_s = np.delete(mat,list(range(i,j))+list(range(k,l)),axis=0)

上面删除了行i:j和k:l

因为只能使用一组固定的
步幅来创建内存视图
,因此您必须在本例中创建一个副本,其中
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])

因此,这仅适用于等间距单元的视图。但是,如果您想查看一个连续的
切片(0,i)
和另一个连续的
切片(j,mat.shape[0])
,它将不起作用。你得复印一份。

你为什么不直接用
mat[j:i,:]
?@Kasramvd这和他现在做的不一样。只要想想一个数组的形状
(100,1)
,其中
i=50
j=20
。结果的
np.concatenate
创建了一个重叠的结果数组,而您的
mat[j:i,:]
没有。应该指定,但是j大于i。这只会返回一个empy数组.Aha,因此如果
j>i
,那么
np.concatenate
不会创建重叠数组,而是包含两个分离的数组。但卡斯拉姆夫的解决方案仍然行不通。filippo已经展示了一个很好的方法来处理这个问题。@filippo是的,没错,它实际上会重复一些行。这个方法还会返回数组的一个副本。谢谢!我没想到要提到它,但是数组中元素的顺序并不重要,所以这很好。太好了,我很高兴我能帮上忙!