NumPy多维数组切片

8
假设我已经定义了一个 3x3x3 的 numpy 数组,其代码如下:
x = numpy.arange(27).reshape((3, 3, 3))

现在,我可以使用x[:, 0, 1]获取包含每个3x3子数组的(0,1)元素的数组,它返回array([ 1, 10, 19])。如果我有一个元组(m,n),并且想要检索存储在元组中的每个子数组(0,1)的(m,n)元素怎么办?
例如,假设我有t = (0, 1)。我尝试使用x[:, t],但它没有正确的行为 - 它返回每个子数组的第0行和第1行。我找到的最简单的解决方案是:
x.transpose()[tuple(reversed(t))].transpose()

但我相信一定有更好的方法。当然,在这种情况下,我可以使用x [:,t [0],t [1]],但这不能推广到我不知道xt具有多少维的情况。

2个回答

9

你可以先创建索引元组:

index = (numpy.s_[:],)+t 
x[index]

很酷,谢谢您的帮助(wim 也是)。我在 scipy 找到了更多有关 s_ 和 slice 的示例。我想我之前看过那个列表,但没有看到任何相关的东西。 - James

4

HYRY的解决方案是正确的,但我一直觉得numpy的r_, c_s_索引技巧看起来有点奇怪。因此,这里使用slice对象来实现等效操作:

x[(slice(None),) + t]

那个切片函数的参数只是终止位置(也就是说,使用None意味着全部选取,就像x[:]等同于x[None:None])。

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