【问题标题】:slicing multi-dimensional numpy arrays with arrays [duplicate]用数组切片多维numpy数组[重复]
【发布时间】:2012-02-20 01:43:50
【问题描述】:

我有一个约 286 x 181 x 360 的 numpy 数组(我们称之为 test),需要从中提取一个 3-D 数组。三个维度所需的范围被定义为其他 numpy 数组(a_dim、b_dim 和 c_dim)(最终基于用户输入)。天真地,我曾希望我能够做一些类似 big_array[a_dim,b_dim,c_dim] 的事情。当 b_dim 和 c_dim 只包含一个值(这恰好发生在我的主要测试用例中)时,它运行得很好,但当它们大于 1 时就不起作用。

Traceback (most recent call last):
  File "<pyshell#541>", line 1, in <module>
    test[a_dim,b_dim,c_dim]
ValueError: shape mismatch: objects cannot be broadcast to a single shape

为了简化,给定以下4个数组:

test=arange(125).reshape((5,5,5))
a_dim=[0,1]
b_dim=[1,2]
c_dim=[2,3]

我想从上述组合中得到的输出是:

array([[[ 7,  8],
        [12, 13]],

       [[32, 33],
        [37, 38]]])

或者,一个 3D 数组,其中包含在 a_dim、b_dim 和 c_dim 中定义的所有行、列和波段(或任何您想称为第三维的内容)。我已经尝试为此使用 ix_ ,但显然在我看到的示例中遗漏了一些东西:

>>> test[ix_((a_dim,b_dim,c_dim))]

Traceback (most recent call last):
  File "<pyshell#517>", line 1, in <module>
    test[ix_((a_dim,b_dim,c_dim))]
  File "C:\Python27\lib\site-packages\numpy\lib\index_tricks.py", line 73, in ix_
    raise ValueError, "Cross index must be 1 dimensional"
ValueError: Cross index must be 1 dimensional

有什么建议吗? 谢谢!

【问题讨论】:

    标签: multidimensional-array numpy slice


    【解决方案1】:

    如此接近 - 只需删除对 numpy.ix_() 的调用中的一对括号:

    >>> test[ix_(a_dim,b_dim,c_dim)]
    array([[[ 7,  8],
            [12, 13]],
    
           [[32, 33],
            [37, 38]]])
    

    【讨论】:

    • 啊哈!谢谢。感谢您发现这一点 - 这让我发疯了。
    猜你喜欢
    • 2021-11-23
    • 2021-03-19
    • 2015-01-29
    • 1970-01-01
    • 2019-05-14
    • 2015-10-23
    • 1970-01-01
    • 2015-04-10
    相关资源
    最近更新 更多