import numpy as np
a = np.zeros((10,20,30))
要提取第二维和第三维中的元素,ind1和ind2是索引列表
ind1 = [0,5,6]
ind2 = [1,2,7,8]
a[:,ind1,ind2]
上面的命令给出了IndexError:shape mismatch
如果我们按如下方式编制索引
a1 = a[:,ind1,:]
a2 = a1[:,:,ind2]
它有效,如果ind1和ind2的维度相同,那么索引就可以了。
对于多维数组,索引列表是否必须具有相同的形状?
答案 0 :(得分:1)
由于输出的形状由索引数组的形状决定,是的,它们必须相同。
或者说兼容,以下
i1, i2 = np.ix_(ind1, ind2)
a[:, i1, i2]
会奏效。它产生一个10x3x4阵列,通过选择ind1,ind2的所有组合(i1,i2是形状(3,1)(1,4),因此它们一起广播)。
相反,“正常”行为(当ind1和ind2不可广播时)只是选择ind1和ind2的相应元素,这就是为什么它们的形状必须一致。
这是一个更简单的示例来显示差异
>>> z = np.zeros((5,5), int)
>>> a = [1,2,4]
>>> z[a,a] = 1
>>> z # 3 points set
array([[0, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]])
>>> a1,a2 = np.ix_(a,a)
>>> z[a1,a2] = 1
>>> z # 3x3 points set
array([[0, 0, 0, 0, 0],
[0, 1, 1, 0, 1],
[0, 1, 1, 0, 1],
[0, 0, 0, 0, 0],
[0, 1, 1, 0, 1]])
答案 1 :(得分:1)
保罗的回答可能会回答你的问题,但我发现它不起作用,因为如果你这样做,你会同时使用这些索引:
a[:,ind1,:][:,:,ind2]
它没有得到索引错误