2013-07-22 37 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])