numpy如何排序数组切片索引?
问题内容:
我有一个data
形状为(28,8,20)的np.array,我只需要其中的某些条目,所以我要切片:
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)
这使我们进入了实际
题:
我想知道这种行为的原因是什么?谁决定这是应该如何工作的,可能比我更了解编程,并认为这在某种程度上是一致的,我完全不了解。除非有办法让我理解,否则我可能会继续打我的头。
问题答案:
这是(高级)部分索引的情况。有2个索引数组和1个切片
如果索引子空间(由切片对象)分开,则首先广播的索引空间,然后是x的切片子空间。
http://docs.scipy.org/doc/numpy-1.8.1/reference/arrays.indexing.html#advanced-
indexing
先进的索引例如笔记,当ind_1
,ind_2
broadcastable子空间shape (2,3,4)
是:
但是,x
[:,ind_1,:,ind_2]的形状为(2,3,4,10,30,50),因为在索引子空间中没有明确的放置位置,因此将其固定在开始位置。始终可以使用.transpose()将子空间移动到所需的任何位置。
换句话说,此索引与并不相同x[:, ind_1][[:,ind_2]
。这两个数组共同操作以定义一个(2,3,4)
子空间。
在您的示例中,extract[0,:,np.array([0,1])]
意思是选择一个(2,)
子空间([0]和[0,1]共同起作用,而不是顺序作用),然后以某种方式将其与中间维度合并。
一个更详细的示例是extract[[1,0],:,[[0,1],[1,0]]]
,它产生一个(2,2,8)
数组。这是(2,2)
第一个维度和最后一个维度以及中间维度的子空间。另一方面,X[[1,0]][:,:,[[0,1],[1,0]]]
产生一个(2,8,2,2)
,分别从第一个维度和最后一个维度中进行选择。
关键区别在于索引选择是顺序操作还是联合操作。`[…] […]语法已经可以按顺序操作。高级索引为您提供了一种联合索引的方式。