在第一种情况下,您a
使用 2 个相同长度的列表对数组进行索引,这相当于使用 2 个相同形状的数组进行索引(请参阅numpy docs on arrays as indices)。
因此,输出是a[0,0]
(与 相同a[0,0,:]
)和a[1,1]
,索引数组的元素组合。这预计会返回一个形状为 2,3 的数组。2 因为它是索引数组的长度,而 3 因为它是未索引的轴。
然而,在第二种情况下,结果是a[:,0]
(等价于a[:,0,:]
)和a[:,1]
。因此,这里预期的结果是一个数组,第一维和第三维等于原始数组,第二维等于2,即索引数组的长度(这里与第二轴的原始大小相同) .
为了清楚地表明这两个操作显然不相同,我们可以尝试假设:
与轴到第三轴的长度相同的范围之间的等价性,这将导致:
print(a[[0,1],[0,1],[0,1,2]])
IndexError Traceback (most recent call last)
<ipython-input-8-110de8f5f6d8> in <module>()
----> 1 print(a[[0,1],[0,1],[0,1,2]])
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (2,) (3,)
那是因为没有可能的索引数组的元素组合。与此相反,a[:,:,:]
将返回整个数组,并按预期a[[0,1],[0,1],[0,2]]
返回[ 1 12]
一个长度为 2 的一维数组,如索引数组。