所以,我创建了一个numpy数组:
a = np.arange(25).reshape(5,5)
array([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,13,14],[15、16、17、18、19],[20,21,22,23,24]])
常规切片a[1:3,1:3]
返回
array([[6,7],[11,12]])
[使用第二个a[1:3,[1,2]]
中的列表一样
array([[6,7],[11,12]])
但是,a[[1,2],[1,2]]
返回
array([6,12])
显然,我在这里不了解某些内容。就是说,切片列表有时可能非常有用。
干杯,
keng
在最后一种情况下,两个单独的列表被视为单独的索引操作(这确实很尴尬,请耐心等待。)>
Numpy看到两个包含两个整数的列表,并因此决定要两个值。每个值的行索引来自第一个列表,而每个值的列索引来自第二个列表。因此,您得到a[1,1]
和a[2,2]
。 :
表示法不仅扩展到您已经精确推导出的列表,而且还告诉numpy您希望该范围内的所有行/列。
如果您提供手动管理的列表索引,则它们的大小必须相同,因为每个/任何列表的大小都是您将获得的元素数。例如,如果您想要第1,2,3行的第1列和第2列中的元素:
>>> a[1:4,[1,2]] array([[ 6, 7], [11, 12], [16, 17]])
但是
>>> a[[1,2,3],[1,2]] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)
[前者告诉numpy,您需要一定范围的行和特定的列,而后者则说“让我得到
(1,1)
,(2,2)
和(3, hey! what the?! where's the other index?)
的元素”
a[[1,2],[1,2]]
读为,我想要a [1,1]和a [2,2]。有几种解决方法,我可能甚至没有最好的方法,但是您可以尝试
它触发advanced indexing,所以第一个切片是行索引,第二个是列索引。对于每一行,它选择相应的列。