Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将低维numpy数组的部分提取到高维数组的最终轴_Python_Arrays_Numpy - Fatal编程技术网

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]])

你是对的,编辑为修复