我有一个3D数据数组。我有一个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]])
有一种干净利落的方式吗?
答案 0 :(得分:3)
如果我理解正确,我使用花哨的索引做了类似的事情:
>>> 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.indices(a.shape[:2])
也应该起作用而不是meshgrid
。哪一个更快(显然)取决于您使用的元素数量。