Python numpy数组切片,从每个三维空间获取一个

Python numpy数组切片,从每个三维空间获取一个,python,multidimensional-array,numpy,indexing,Python,Multidimensional Array,Numpy,Indexing,我有一个3D数据阵列。我有一个2D索引数组,其中形状匹配数据数组的前两个维度,它指定了我要从数据数组中提取的索引,以创建2D数组。例如: from numpy import * a = arange(3 * 5 * 7).reshape((3,5,7)) getters = array([0,1,2] * (5)).reshape(3,5) 我要寻找的是一种类似a[:,:,getters]的语法,它通过独立索引到每个项目的第三维来返回一个形状数组(3,5)。但是,a[:,:,getter

我有一个3D数据阵列。我有一个2D索引数组,其中形状匹配数据数组的前两个维度,它指定了我要从数据数组中提取的索引,以创建2D数组。例如:

 from numpy import *
 a = arange(3 * 5 * 7).reshape((3,5,7))
 getters = array([0,1,2] * (5)).reshape(3,5)
我要寻找的是一种类似
a[:,:,getters]
的语法,它通过独立索引到每个项目的第三维来返回一个形状数组(3,5)。但是,
a[:,:,getters]
返回一个形状数组(3,5,3,5)。我可以通过迭代和构建一个新数组来实现,但这相当慢:

 array([[col[getters[ri,ci]] for ci,col in enumerate(row)] for ri,row in enumerate(a)])
 # gives array([[  0,   8,  16,  21,  29],
 #    [ 37,  42,  50,  58,  63],
 #    [ 71,  79,  84,  92, 100]])

有没有一种简洁而快速的方法?

如果我没弄错的话,我已经用奇特的索引做了类似的事情:

>>> k,j = np.meshgrid(np.arange(a.shape[1]),np.arange(a.shape[0]))
>>> k
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])
>>> j
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2]])
>>> a[j,k,getters]
array([[  0,   8,  16,  21,  29],
       [ 37,  42,  50,  58,  63],
       [ 71,  79,  84,  92, 100]])

当然,您可以随时使用
k
j
。正如DSM在下面的评论中指出的那样,
j,k=np.索引(a.shape[:2])
也应该起作用,而不是
meshgrid
。哪一个更快(显然)取决于您使用的元素数量。

小调整:
j,k=np.index(a.shape[:2])
。index是一个非常好的函数,但在短期测试中,它的性能比meshgrid@EnricoGiampieri:虽然
np.索引
对于较大的数组是有利的,但这是正确的;我得到了大约10^6个元素的交叉。@DMS我想这取决于机器,对于10^6个元素(形状(50,50,50)),我得到np.index需要两倍的时间。从源代码中很难说在什么条件下哪一种性能更好……有什么见解吗?@DSM——谢谢。事实上,我曾经尝试过解决这个问题,我在上面发布的解决方案是我能想到的最好的。与许多事情一样,numpy也有不同的方法。