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:形状不匹配
如果我们按如下方式建立索引
a1 = a[:,ind1,:]
a2 = a1[:,:,ind2]
它有效,如果 ind1 和 ind2 的尺寸相同,则索引有效。
多维数组的索引列表是否必须具有相同的形状?
最佳答案
由于输出的形状由索引数组的形状决定,所以它们必须相同。
或者更确切地说兼容,以下
i1, i2 = np.ix_(ind1, ind2)
a[:, i1, i2]
会起作用的。它通过选取 ind1、ind2 的所有组合来生成一个 10x3x4 数组(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]])
关于python - Numpy 数组多维索引与列表 IndexError : shape mismatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42382992/