用数组切割多维numpy数组

时间:2012-01-26 23:28:21

标签: multidimensional-array numpy slice

我有一个~286 x 181 x 360的numpy数组(我们称之为测试),需要从中提取一个三维数组。三维所需的范围被定义为其他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]]])

或者,包含a_dim,b_dim和c_dim中定义的所有行,列和带(或者您想称为第三维的任何内容)的3D数组。我已经尝试过使用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

有什么建议吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

如此接近 - 只需在调用numpy.ix_()

中删除一对parens
>>> test[ix_(a_dim,b_dim,c_dim)]
array([[[ 7,  8],
        [12, 13]],

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