2012-03-27 222 views

回答

2

使用python怎么样?

result = array([subarray[index] for subarray, index in zip(m, select)]) 
0
result = array([m[j][0] if i==0 else m[j][1] for i,j in zip(select, range(0, len(m)))]) 
2

我更喜欢使用NP.where对于这种索引任务(而不是NP.ix_

什么没有在OP提到的是,是否结果由位置(源数组中的行/列)或某些条件(例如m> = 5)选择。无论如何,下面的代码片段涵盖了两种情况。

三个步骤:

  1. 创建条件数组;

  2. 产生索引阵列通过调用NP.where,通过在这种条件 阵列;和

  3. 申请这个索引对源阵列


>>> import numpy as NP 

>>> cnd = (m==1) | (m==5) | (m==7) | (m==6) 
>>> cnd 
    matrix([[ True, False], 
      [False, True], 
      [ True, False], 
      [ True, False]], dtype=bool) 

>>> # generate the index array/matrix 
>>> # by calling NP.where, passing in the condition (cnd) 
>>> ndx = NP.where(cnd) 
>>> ndx 
    (matrix([[0, 1, 2, 3]]), matrix([[0, 1, 0, 0]])) 

>>> # now apply it against the source array 
>>> m[ndx] 
    matrix([[1, 5, 7, 6]]) 


传递给NP.where的参数,CND,阵列是一个布尔数组,它在这种情况是由复合条件表达式(上面第一行)组成的单个表达式的结果

如果构建这样一个值过滤器并不适用于您的特定用途的情况下,那也没关系,你只需要产生实际的布尔矩阵其他方式(的CND值)(或直接创建) 。

10

numpy的办法做到这一点是使用np.choose或花哨的索引/取(见下文):

m = array([[1, 2], 
      [4, 5], 
      [7, 8], 
      [6, 2]]) 
select = array([0,1,0,0]) 

result = np.choose(select, m.T) 

所以没有必要蟒蛇循环,或任何东西,所有的速度优势numpy给你。 m.T只是需要,因为选择实际上是两个阵列之间的更多选择np.choose(select, (m[:,0], m[:1])),但其直接使用它就像这样。


使用看中索引

result = m[np.arange(len(select)), select] 

如果速度是非常重要的np.take,这在一维视图(作品其相当快一点由于某种原因,但也许不是这些细小阵列):

result = m.take(select+np.arange(0, len(select) * m.shape[1], m.shape[1])) 
+0

在撰写本文时(np 1.9.2),np.choose()可能会有最大32个元素的严重限制。如果m的长度超过此值,则会收到“ValueError:需要介于2和(32)数组对象(含)之间”。 – 2015-06-12 12:57:30

0

IMHO,这是最简单的变体:

m[np.arange(4), select] 
1

由于标题所指的索引一个2D阵列与另一2D阵列,一般numpy的办法可以解决here

简而言之: 形状的指数(N,M)任意大维数m,命名为INDS,用于访问形状的另一二维阵列的元件的2D阵列(N,K),命名

# array of index offsets to be added to each row of inds 
offset = np.arange(0, inds.size, inds.shape[1]) 

# numpy.take(B, C) "flattens" arrays B and C and selects elements from B based on indices in C 
Result = np.take(B, offset[:,np.newaxis]+inds) 
+1

@NickA谢谢,我添加了解决方案 – Ataxias 2017-08-03 13:00:05