Python numpy,不同阵列层的不同切片

Python numpy,不同阵列层的不同切片,python,arrays,numpy,vectorization,Python,Arrays,Numpy,Vectorization,我有一个3d数组m*n*k,对于每个2d层,我想取一个大小为I*j的子数组。我有一个数组c,每个层的切片起始坐标的大小2*k。有没有一种简单易行的方法,不用任何循环就能得到我需要的东西 例如: test = np.arange(18).reshape((3,3,2)) c = np.array([[0,1], [0, 1]]) test[:,:,0] = array([[ 0, 2, 4], [ 6, 8, 10],

我有一个3d数组
m*n*k
,对于每个2d层,我想取一个大小为
I*j
的子数组。我有一个数组c,每个层的切片起始坐标的大小
2*k
。有没有一种简单易行的方法,不用任何循环就能得到我需要的东西

例如:

test = np.arange(18).reshape((3,3,2))
c = np.array([[0,1], [0, 1]])

test[:,:,0] = array([[ 0,  2,  4],
                     [ 6,  8, 10],
                     [12, 14, 16]])

test[:,:,1] = array([[ 1,  3,  5],
                     [ 7,  9, 11],
                     [13, 15, 17]])
我想要一个数组

  [[[ 0,  9],
    [ 2,  11]],

   [[ 6,  15],
    [ 8,  17]]]
带循环的解决方案:

h=2
w=2
layers = 2
F = np.zeros((h,w,layers))
for k in range(layers):
    F[:,:,k] = test[c[0,k]:c[0,k]+h, c[1,k]:c[1,k]+w, k]

这是一种矢量化方法,使用和-

样本运行-

In [112]: test = np.arange(200).reshape((10,10,2))
     ...: c = np.array([[0,1], [0, 1]])
     ...: 

In [113]: h=4
     ...: w=5
     ...: layers = 2
     ...: F = np.zeros((h,w,layers))
     ...: for k in range(layers):
     ...:     F[:,:,k] = test[c[0,k]:c[0,k]+h, c[1,k]:c[1,k]+w, k]
     ...:     

In [114]: d0,d1,d2 = np.ogrid[:h,:w,:layers]
     ...: out = test[d0+c[0],d1+c[1],d2]
     ...: 

In [115]: np.allclose(F, out)
Out[115]: True

你能分享一下你将如何通过循环实现这一点吗,因为从给定的输入获得预期的o/p还不清楚。添加了循环解决方案当我在给定的输入上运行代码时,我看到了
indexer
.Oops。修正了,抱歉。当h!=W我得到了
索引错误:形状不匹配
@EgorIgnatenkov确实是个bug。更新。过来看。
In [112]: test = np.arange(200).reshape((10,10,2))
     ...: c = np.array([[0,1], [0, 1]])
     ...: 

In [113]: h=4
     ...: w=5
     ...: layers = 2
     ...: F = np.zeros((h,w,layers))
     ...: for k in range(layers):
     ...:     F[:,:,k] = test[c[0,k]:c[0,k]+h, c[1,k]:c[1,k]+w, k]
     ...:     

In [114]: d0,d1,d2 = np.ogrid[:h,:w,:layers]
     ...: out = test[d0+c[0],d1+c[1],d2]
     ...: 

In [115]: np.allclose(F, out)
Out[115]: True