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]
它没有获得索引错误