【发布时间】:2015-01-21 13:14:02
【问题描述】:
我有一个形状为 (28,8,20) 的 np.array data,我只需要其中的某些条目,所以我要分片:
In [41]: index = np.array([ 5, 6, 7, 8, 9, 10, 11, 17, 18, 19])
In [42]: extract = data[:,:,index]
In [43]: extract.shape
Out[43]: (28, 8, 10)
到目前为止一切都很好,一切都应该如此。但现在我只想查看第一行最后一个索引上的前两个条目:
In [45]: extract[0,:,np.array([0,1])].shape
Out[45]: (2, 8)
等等,应该是 (8,2)。它切换了索引,即使我上次切片时它没有!根据我的理解,下面的行为应该是一样的:
In [46]: extract[0,:,:2].shape
Out[46]: (8, 2)
...但这正是我想要的!不过,只要我有一个 3D 数组,这两种方法似乎都是等效的:
In [47]: extract[:,:,np.array([0,1])].shape
Out[47]: (28, 8, 2)
In [48]: extract[:,:,:2].shape
Out[48]: (28, 8, 2)
如果我想要的不仅仅是前两个条目,而是一个不规则的列表,我该怎么办?我当然可以在操作后转置矩阵,但这似乎非常违反直觉。 我的问题的一个更好的解决方案是这样(尽管可能有一个更优雅的解决方案):
In [64]: extract[0][:,[0,1]].shape
Out[64]: (8, 2)
这将我们带入实际
问题:
我想知道这种行为的原因是什么?谁决定这就是它应该如何工作的人可能比我更了解编程,并认为这在某种程度上是一致的,而我完全错过了。除非我有办法理解它,否则我可能会一直在这个问题上大发雷霆。
【问题讨论】:
-
The docs 用于高级索引(使用数组作为索引)承认这种行为“可能有点难以理解”。我不敢尝试完全掌握这种索引的复杂性。可以这么说,使用数组而不是切片(即
[0, 1]而不是:2)会触发不同类型的索引行为,并且组合不同类型的索引(单个整数、切片、数组)可以快速带您进入陌生的领域。
标签: python arrays numpy indexing slice