2015-05-12 18 views
2

我有一个多维numpy数组,我想采取它的一些元素来构造一维数组。那我需要的元素由他们给出的指标,例如:如何从numpy数组中有效地提取由其索引给出的元素列表?

inds = [(0,0), (0,1), (1,1), (1,0), (0,2)] 

我解决它在一个简单的方法:

ls = [] 
for i, j in inds: 
    ls += [a[i,j]] 

它提供所需的结果。但是,我意识到这个解决方案对于我的目的来说太慢了。有没有可能以更有效的方式做同样的事情?

回答

4

numpy数组可以用序列(以及更一般的numpy数组)进行索引。

例如,这里是我的阵列a

In [19]: a 
Out[19]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14]]) 

ij握住你的inds阵列的第一和第二坐标序列:

In [20]: i 
Out[20]: [0, 0, 1, 1, 0] 

In [21]: j 
Out[21]: [0, 1, 1, 0, 2] 

您可以使用这些拉相应的值出a

In [22]: a[i, j] 
Out[22]: array([0, 1, 6, 5, 2]) 

如果你已经在你的代码有inds,你可以的元组的列表使用zip分成ij

In [23]: inds 
Out[23]: [(0, 0), (0, 1), (1, 1), (1, 0), (0, 2)] 

In [24]: i, j = zip(*inds) 

In [25]: i 
Out[25]: (0, 0, 1, 1, 0) 

In [26]: j 
Out[26]: (0, 1, 1, 0, 2) 

或者,如果inds与形状(N,2),这样一个数组:

In [27]: inds = np.array(inds) 

In [28]: inds 
Out[28]: 
array([[0, 0], 
     [0, 1], 
     [1, 1], 
     [1, 0], 
     [0, 2]]) 

你可以简单地指定的inds转置到i, j

In [33]: i, j = inds.T 

In [34]: i 
Out[34]: array([0, 0, 1, 1, 0]) 

In [35]: j 
Out[35]: array([0, 1, 1, 0, 2]) 

In [36]: a[i, j] 
Out[36]: array([0, 1, 6, 5, 2]) 
相关问题