假设我们有:
- 一个n维的numpy.array A - 一个dtype为int且形状为(n, m)的numpy.array B
如何使用B对A进行索引,以便结果是一个形状为(m,)的数组,其中的值来自于B指定的列所示位置?
例如,考虑以下代码,当B是Python列表时,它可以实现我想要的功能:
然而,当B是一个numpy数组时,结果会有所不同:
现在,我可以通过将B转换为元组来获得期望的结果,但这肯定不是正确/惯用的做法吧?
有没有一个numpy函数可以实现不将B转换为元组而达到相同的效果?
- 一个n维的numpy.array A - 一个dtype为int且形状为(n, m)的numpy.array B
如何使用B对A进行索引,以便结果是一个形状为(m,)的数组,其中的值来自于B指定的列所示位置?
例如,考虑以下代码,当B是Python列表时,它可以实现我想要的功能:
>>> a = np.arange(27).reshape(3,3,3)
>>> a[[0, 1, 2], [0, 0, 0], [1, 1, 2]]
array([ 1, 10, 20]) # the result we're after
>>> bl = [[0, 1, 2], [0, 0, 0], [1, 1, 2]]
>>> a[bl]
array([ 1, 10, 20]) # also works when indexing with a python list
>>> a[bl].shape
(3,)
然而,当B是一个numpy数组时,结果会有所不同:
>>> b = np.array(bl)
>>> a[b].shape
(3, 3, 3, 3)
现在,我可以通过将B转换为元组来获得期望的结果,但这肯定不是正确/惯用的做法吧?
>>> a[tuple(b)]
array([ 1, 10, 20])
有没有一个numpy函数可以实现不将B转换为元组而达到相同的效果?
flat
和np.take
是两个不同的替代方案。 - Divakar%timeit
。你不需要这样做,我只是为了公平的基准测试而说。再次强调,OP似乎正在寻找一种惯用的方式。个人意见-无论哪种方式,tuple
都不错。 - Divakar%timeit
是[IPython](http://ipython.org/)的特性/魔法,是吗?如果是这样,我不使用iPython。实际上,我没有不使用它的理由。 - keepAlivea = np.random.randint(0,9,(10,10,10,10,10,10)); b = np.random.randint(0,10,(6,10000))
? - Divakar