【问题标题】:Tuple as index of multidimensional array元组作为多维数组的索引
【发布时间】:2012-08-29 05:55:38
【问题描述】:

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

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)|.

那我怎样才能“解包”这个元组呢?有任何想法吗? 谢谢!

【问题讨论】:

    标签: python arrays numpy scipy tuples


    【解决方案1】:

    你也可以单独传入你的第一个元组来获取感兴趣的切片,然后单独索引它:

    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] 就像一个魅力。很好的见解,谢谢!
    【解决方案2】:

    由于您使用的是numpy

    big_array[tup+(3,2)]
    

    应该可以。当您调用__getitem__(通过方括号)时,这些内容将作为元组传递给__getitem__。您只需要在此处显式构造tuple(将元组添加在一起并连接成一个新元组),numpy 就会满足您的要求。

    【讨论】:

    • 简单而完美,就像一个魅力!我不知道你可以用元组做到这一点,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多