Numpy阵列多维索引,列表indexError:形状不匹配


import numpy as np
a = np.zeros((10,20,30))

要在第二和第三维中提取元素,IND1和IND2是指数列表

ind1 = [0,5,6]
ind2 = [1,2,7,8]
a[:,ind1,ind2]

上面的命令给出一个索引:形状不匹配

如果我们进行索引如下

a1 = a[:,ind1,:]
a2 = a1[:,:,ind2]

它有效,如果IND1和IND2的尺寸相同,则索引起作用。

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

作为输出的形状由索引数组的形状确定,是的,它们必须相同。

或更确切地说,以下是以下

i1, i2 = np.ix_(ind1, ind2)
a[:, i1, i2]

将起作用。它通过选择IND1,IND2(I1,I2是形状(3,1)(1)(1,4)的所有组合来产生10x3x4阵列,因此它们是一起广播的)。

相比

这是一个更简单的示例,可以显示差异

>>> 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]])

保罗的答案可能会回答您的问题,但我发现它不起作用,因为您同时使用这些索引,如果您执行以下操作:

a[:,ind1,:][:,:,ind2]

它没有获得索引错误

最新更新