元组作为多维数组的索引

时间:2012-09-04 14:34:02

标签: python arrays numpy scipy tuples

我发现了一个与我非常相似的问题,但不完全相同。 这一个:here 然而,在ntimes的情况下,数组的大小与元组指向的维度的数量相匹配。 在我的例子中,我有一个4维数组和一个二维元组,就像这样:

from numpy.random import rand
big_array=rand(3,3,4,5)
tup=(2,2)

我想使用元组作为前两个维度的索引,并手动索引最后两个维度。类似的东西:

big_array[tup,3,2]

但是,我沿着第四维获得了第一个维度的索引= 2的重复(因为它在技术上尚未被索引)。这是因为这个索引将双索引解释为第一维而不是每个维的一个值

eg. 
| dim 0:(index 2 AND index 2) , dim 1:(index 3), dim 2:(index 2), dim 3:(no index)|
instead of 
|dim 0(index 2), dim 1(index 2), dim 2:(index 3), dim 3:(index 2)|.

我怎样才能'打开'这个元组呢?有任何想法吗? 谢谢!

2 个答案:

答案 0 :(得分:8)

由于您使用的是numpy

big_array[tup+(3,2)]

应该有效。当您调用__getitem__(通过方括号)时,这些内容会作为元组传递给__getitem__。你只需要在这里明确地构造tuple(将元组连接成一个新的元组),numpy就可以做你想做的事。

答案 1 :(得分:2)

你也可以单独传递你的第一个元组以获得感兴趣的切片,然后分别编入索引:

from numpy.random import rand
big_array=rand(3,3,4,5)
chosen_slice = (2,2)

>>> big_array[ chosen_slice ]
array([[ 0.96281602,  0.38296561,  0.59362615,  0.74032818,  0.88169483],
       [ 0.54893771,  0.33640089,  0.53352849,  0.75534718,  0.38815883],
       [ 0.85247424,  0.9441886 ,  0.74682007,  0.87371017,  0.68644639],
       [ 0.52858188,  0.74717948,  0.76120181,  0.08314177,  0.99557654]])

>>> chosen_part = (1,1)

>>> big_array[ chosen_slice ][ chosen_part ]
0.33640088565877657

对于某些用户而言,这可能稍微有点可读,但除此之外我还倾向于mgilson的解决方案。