numpy ndarray高级索引

时间:2015-06-03 02:19:17

标签: python numpy

我有三维的ndarray。 如何从第一轴选择索引0和1,同时从第二轴选择索引0和3,从第三轴选择索引1?

我尝试使用索引[(0,1),(1,3),1],它产生的结果与我想象的完全不同。

这里有两个问题。 [(0,1),(1,3),1]做什么? 以及如何正确创建解决我原始问题的索引。

a = np.arange(30).reshape(3, 5, 2)
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7],
        [ 8,  9]],

       [[10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]],

       [[20, 21],
        [22, 23],
        [24, 25],
        [26, 27],
        [28, 29]]])

a[0, (1, 3), 1]  # produces array([3, 7])
a[(0,1), (1, 3), 1] # produces array([ 3, 17])

```

1 个答案:

答案 0 :(得分:1)

当您对自己的方式进行索引时,NumPy并不会将其解释为选择每个维度的索引。相反,NumPy互相广播论据:

a[(0,1), (1, 3), 1] -> a[array([0, 1]), array([1, 3]), array([1, 1])]

然后创建一个结果数组a[i, j, k][x] == a[i[x], j[x], k[x]]

要获得您正在寻找的行为,您需要重塑您传递的参数,以便相互广播它们会产生一个形状(2, 2)的数组而不是形状{{ 1}}。这意味着第一个参数需要形状(2,),第二个参数需要具有形状(2, 1)(1, 2),并且第三个参数的形状很好。 numpy.ix_可以使这更容易,但它不支持标量参数。 (2,)按照您的预期a[np.ix_([0, 1], [1, 3], [1])]执行操作,但要获得a[[0, 1], [1, 3], [1]]所期望的形状,您的选择会更加混乱:

a[[0, 1], [1, 3], 1]