2014-01-25 131 views
6

我很确定我错过了整数索引,并可以使用一些帮助。说,我创建一个二维数组:numpy数组在多个维度上的整数索引

>>> import numpy as np 
>>> x=np.array(range(24)).reshape((4,6)) 
>>> x 
array([[ 0, 1, 2, 3, 4, 5], 
     [ 6, 7, 8, 9, 10, 11], 
     [12, 13, 14, 15, 16, 17], 
     [18, 19, 20, 21, 22, 23]]) 

我可以选取行1和2与:

>>> x[[1,2],:] 
array([[ 6, 7, 8, 9, 10, 11], 
     [12, 13, 14, 15, 16, 17]]) 

或行2的第1列和3:

>>> x[[1,2],1] 
array([ 7, 13]) 

所以对我来说,我可以选择第1行和第2行的第3,4和5列:

>>> x[[1,2],[3,4,5]] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

,而是我需要做的是在两个步骤:

>>> a=x[[1,2],:] 
>>> a 
array([[ 6, 7, 8, 9, 10, 11], 
     [12, 13, 14, 15, 16, 17]]) 
>>> a[:,[3,4,5]] 
array([[ 9, 10, 11], 
     [15, 16, 17]]) 

来自R的到来,我的期望似乎是错误的。你能否确认这一步实际上是不可能的,或者建议一个更好的选择?谢谢!

编辑:请注意我在示例中的行和列的选择恰好是连续的,但它们不一定是。换句话说,分片索引不适合我的情况。

回答

3

您还可以使用索引阵列中的广播,这是我通常会做的,而不是索引的两倍,这就造成你的数据的中间副本的选项:

>>> x[[[1], [2]],[[3, 4, 5]]] 
array([[ 9, 10, 11], 
     [15, 16, 17]]) 

要看到一个好一点的是怎么回事,如何处理指数较大的数字:

>>> row_idx = np.array([1, 2]) 
>>> col_idx = np.array([3, 4, 5]) 
>>> x[row_idx.reshape(-1, 1), col_idx] 
array([[ 9, 10, 11], 
     [15, 16, 17]]) 
+0

你是对的,那个中间拷贝真的让我感到困扰。 Thans很多! – Miquel

+0

不错;我没有意识到这一点! –

+1

我迷失在圆括号中... –

2

事情是这样的:

In [28]: x[1:3, 3:6]                    
Out[28]: 
array([[ 9, 10, 11], 
     [15, 16, 17]]) 
+0

谢谢!不过,我需要使用索引数组而不是索引进行索引。换句话说,行和列可能不是连续的或者不成立的 – Miquel

+1

@Miquel我不认为有可能以这种方式在多维数组上进行索引。阅读:http://docs.scipy.org/doc/numpy/user/basics.indexing.html#indexing-multi-dimensional-arrays –