2017-04-20 111 views
1

我有以下numpy數組: (nx1)的真值表,以及(nxk)的矩陣,其中n是5並且k在此示例中是2。使用邏輯索引從數組中提取向量

btable = np.array([[True],[False],[False],[True],[True]]) 
bb=np.array([[1.842,4.607],[5.659,4.799],[6.352,3.290],[2.904,4.612],[3.231,4.939]]) 

我想根據btable中的索引值提取bb中的向量。

我試圖choicebb=bb[btable==True]這讓我的結果

[ 1.84207953 2.90401653 3.23197916] 

choicebb=bb[btable]讓我相同的結果也是如此。

我想反而是

[1.842,4.607]

[2.904,4.612]

[3.231,4.939]

我也試過

choicebb=bb[btable==True,:] 

但後來我會得到

---> 13 choicebb=bb[btable==True,:]

14 print(choicebb)

IndexError: too many indices for array

這可以在MATLAB輕鬆完成與choicebb=bb(btable,:);

+1

'btable'必須是'np.array([True,False,False,True,True])''。 – Serenity

+0

我使用類似'matches =(idx == i)'的命令生成它,其中idx是一個kx1數組,我是我的匹配標準。 – user2118915

回答

1

獲取1D版本掩模與np.ravel()[:,0]切片出的第一列和使用它的邏輯索引到數據陣列中,像這樣 -

bb[btable.ravel()] 
bb[btable[:,0]] 

請注意,bb[btable.ravel()]實質上是 - bb[btable.ravel(),:]。在NumPy中,如果要選擇所有元素,我們可以跳過提及尾部軸,這就是爲什麼它簡化爲bb[btable.ravel()]

Explanataion:索引到一個單一的軸線而使得其選擇沿軸的其餘部分的所有元素,我們需要在沿該軸線的一維陣列(布爾或整數數組),以進給和使用:沿剩下的軸。在我們的例子中,我們將第一個軸索引爲選擇行,所以我們需要沿着該軸輸入一個布爾數組,沿着其餘的軸輸入一個布爾數組。

當我們餵養的2D版本的面具,它沿着那些相應的多軸索引。所以,當我們輸入(N,1)形狀的布爾數組時,我們選擇了正確的行,但也只選擇了第一列元素,這不是預期的輸出。

+0

謝謝,這個作品!我能否獲得有關需要獲取1D版本掩碼的邏輯的解釋,因爲它已經是nx1陣列了? – user2118915

+0

@ user2118915看看添加的評論是否有意義。 – Divakar

+0

我現在明白了。謝謝! – user2118915