元组作为多维数组的索引

9

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

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个回答

9

由于您正在使用numpy

big_array[tup+(3,2)]

应该可以使用。当你调用 __getitem__(通过方括号)时,所需的东西被作为元组传递给 __getitem__。你只需要在这里显式构造 tuple(将元组相加会连接成一个新的元组),numpy 将会按照你想要的方式运行。


简单而完美,就像魔法一样!我不知道元组还能这样用,谢谢你! - lllllll

3

您也可以仅传递第一个元组以获取感兴趣的切片,然后单独对其进行索引:

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的解决方案。


该死!我也喜欢它!我会说这个选项更加灵活,因为你可以更直接地将其放置在“中间”维度中。像这样:big_array[1][tup][2]非常好用。非常棒的见解,谢谢! - lllllll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接