我有一个静态形状(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]
这引发了一个IndexError
。我猜这是因为C
只有2D,并且尺寸无法增加。尽管可以通过平铺来轻松解决C
,但由于C
它很大,因此重新制作m*m
时间会非常昂贵。
所以我的问题是如何将2D数组的不同(2D)部分提取到4D数组的相应部分中。
一种方法是np.meshgrid
创建2D
与(n,n)
形状窗口相对应的索引网格,并添加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]])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句