我有三维的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])
```
答案 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]