2013-07-22 39 views
2

帖子Getting a grid of a matrix via logical indexing in Numpy是相似的,但它不回答我的问题,因为我正在处理一维布尔数组。使用一维布尔数组的Numpy索引

我正尝试在Octave中重新创建以下布尔索引功能。

octave-3.2.4:6> a = rand(3,3) 
a = 

    0.249912 0.934266 0.371962 
    0.505791 0.813354 0.282006 
    0.439417 0.085733 0.886841 
octave-3.2.4:8> a([true false true]) 
ans = 

    0.24991 0.43942 

但是,我无法使用Numpy在Python中创建相同的结果。

>>> import numpy as np 
>>> a = np.random.rand(3,3) 
array([[ 0.94362993, 0.3553076 , 0.12761322], 
     [ 0.19764288, 0.35325583, 0.17034005], 
     [ 0.56812424, 0.48297648, 0.64101657]]) 
>>> a[[True, False, True]] 
array([[ 0.19764288, 0.35325583, 0.17034005], 
     [ 0.94362993, 0.3553076 , 0.12761322], 
     [ 0.19764288, 0.35325583, 0.17034005]]) 
>>> a[np.ix_([True, False, True])] 
array([[ 0.94362993, 0.3553076 , 0.12761322], 
     [ 0.56812424, 0.48297648, 0.64101657]]) 

如何在Numpy上重新创建Python上的Octave布尔索引?

回答

3

两个问题:

  1. 索引与列表[True, False, True]是不一样的用布尔阵列array([True,False,True])索引。该列表将改为解释为整数索引[1,0,1]

  2. 你需要指定你只希望从第一列结果:

    >>> a = np.arange(9).reshape(3,3) 
    >>> a 
    array([[0, 1, 2], 
         [3, 4, 5], 
         [6, 7, 8]]) 
    >>> mask = np.array([True,False,True]) 
    >>> mask.dtype ## verify we have a bool array 
    dtype('bool') 
    >>> a[mask,0] 
    array([0, 6])