1

为什么使用“冒号和逗号”进行切片与使用索引集合不同?

这是我期望产生相同结果的示例,但事实并非如此:

import numpy as np

a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])

print(a[[0,1],[0,1]])
# Output
# [[ 1  2  3]
#  [10 11 12]]

print(a[:,[0,1]])
# Output
# [[[ 1  2  3]
#   [ 4  5  6]]
#  [[ 7  8  9]
#   [10 11 12]]]

为什么它们不相等?

4

1 回答 1

1

在第一种情况下,您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 的一维数组,如索引数组。

于 2018-05-30T09:50:28.830 回答