Numpy数组多维索引与列表IndexError:形状不匹配

时间:2017-02-22 04:53:12

标签: python numpy multidimensional-array

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的维度相同,那么索引就可以了。

对于多维数组,索引列表是否必须具有相同的形状?

2 个答案:

答案 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]

它没有得到索引错误