Python 将低维numpy数组的部分提取到高维数组的最终轴
我有一个静态形状-Python 将低维numpy数组的部分提取到高维数组的最终轴,python,arrays,numpy,Python,Arrays,Numpy,我有一个静态形状-(l,l)数组C。我想把它的一部分提取到另一个数组K,它的形状是(m,m,n,n)。我想从C中提取的内容的起始索引在数组i0中给出,该数组的形状为(m,m) K的某些元素将由K[i,j,:,:]=C[i0[i,j]:i0[i,j]+n,i0[i,j]:i0[i,j]+n]给出。因此,在回答一些类似的问题时,这似乎可以解决问题 C[i0[None, None, ...] + np.arange(n)[..., None, None], i0[None, None, ...]
(l,l)
数组C
。我想把它的一部分提取到另一个数组K
,它的形状是(m,m,n,n)
。我想从C
中提取的内容的起始索引在数组i0
中给出,该数组的形状为(m,m)
K
的某些元素将由K[i,j,:,:]=C[i0[i,j]:i0[i,j]+n,i0[i,j]:i0[i,j]+n]
给出。因此,在回答一些类似的问题时,这似乎可以解决问题
C[i0[None, None, ...] + np.arange(n)[..., None, None],
i0[None, None, ...] + np.arange(n)[..., None, None], I, J]
这将引发一个索引器。我想这是因为C
只是二维的,而且尺寸不能增加。虽然通过平铺C
可以很容易地解决这个问题,但由于C
很大,因此重新制作m*m
次的成本相当高
因此,我的问题是如何将2D数组的不同(2D)部分提取到4D数组的相应部分。一种方法是创建与(n,n)
形状窗口相对应的2D
索引网格,添加那些带有i0
的文件,该文件通过两个新的轴进行扩展,广播将沿着这两个轴进行。最后,我们只需索引到C
,就可以得到所需的4D
输出。因此,一个实现就是这样-
N = np.arange(n)
X,Y = np.meshgrid(N,N)
out = C[i0[...,None,None] + Y,i0[...,None,None] + X]
样本运行-
In [153]: C
Out[153]:
array([[3, 5, 1, 6, 3, 5, 8, 7, 0, 2],
[8, 4, 6, 8, 7, 2, 6, 2, 5, 0],
[3, 7, 7, 7, 3, 4, 4, 6, 7, 6],
[7, 0, 8, 2, 1, 1, 0, 4, 4, 6],
[2, 4, 6, 0, 0, 5, 6, 8, 0, 0],
[4, 6, 1, 0, 5, 6, 2, 1, 7, 4],
[0, 5, 5, 3, 7, 5, 7, 1, 4, 0],
[6, 4, 4, 7, 2, 4, 6, 6, 6, 5],
[5, 2, 3, 2, 2, 5, 4, 5, 2, 5],
[3, 7, 1, 0, 4, 4, 6, 6, 2, 2]])
In [154]: i0
Out[154]:
array([[1, 0, 4, 4],
[0, 4, 4, 0],
[2, 3, 1, 3],
[2, 2, 0, 4]])
In [155]: n = 3
In [157]: out[0,0,:,:]
Out[157]:
array([[4, 6, 8],
[7, 7, 7],
[0, 8, 2]])
In [158]: C[i0[0,0]:i0[0,0]+n,i0[0,0]:i0[0,0]+n]
Out[158]:
array([[4, 6, 8],
[7, 7, 7],
[0, 8, 2]])
你是对的,编辑为修复