2017-06-05 93 views
4

閱讀Numpy快速教程,我無法理解這句話。Numpy教程 - 布爾索引

a = np.arange(12).reshape(3,4) 
b1 = np.array([False,True,True]) 
b2 = np.array([True,False,True,False]) 
>>> a[b1,b2] 
array([ 4, 10]) 

爲什麼a[b1,b2]array([4,10]),而不是array([[4,6],[8,10]])

回答

5

這是因爲您在那裏執行integer array indexing

在內部,索引從布爾數組計算 -

In [72]: idx1 = np.flatnonzero(b1) 

In [73]: idx2 = np.flatnonzero(b2) 

In [75]: idx1 
Out[75]: array([1, 2]) 

In [76]: idx2 
Out[76]: array([0, 2]) 

然後,對每個組使用每個元件從所述索引陣列索引進行整數數組索引 -

In [77]: a[1,0] # 1 from idx1[0], 0 from idx2[0] 
Out[77]: 4 

In [78]: a[2,2] # 2 from idx1[1], 2 from idx2[1] 
Out[78]: 10 

爲了實現這種MATLAB風格的塊提取,我們需要使用開放的數組和索引到每個軸/ dims中。要在NumPy中創建這樣的開放陣列,我們有np.ix_ -

In [89]: np.ix_(b1,b2) 
Out[89]: 
(array([[1], 
     [2]]), array([[0, 2]])) 

In [90]: a[np.ix_(b1,b2)] 
Out[90]: 
array([[ 4, 6], 
     [ 8, 10]]) 
+0

謝謝!!!!!現在我完全明白了。真的很感激它。謝謝 –

+0

@JeYongYeojin如果這解決了您的問題,請考慮通過點擊解決方案旁邊的空白勾來接受它,更多信息在這裏 - https://meta.stackexchange.com/questions/5234/how-does-accepting-an-答案工作 – Divakar