2014-01-20 62 views
2

有誰知道如何在numpy中結合整數索引?具體來說,我得到了幾個np.where的結果,我想提取它們之間通用的元素。如何在邏輯上結合numpy中的整數索引?

對於上下文,我試圖用每個單元的邊界值之間的元素數來填充一個大的3d數組,即我有包括他們的時間,經度和緯度在內的單個事件的記錄。我想把它網格化成3D頻率矩陣,其中維度是時間,經度和緯度。

我可以循環陣列元素做一個np.where(timeCondition & latCondition & lonCondition),人口與結果的長度,但我認爲這將是非常低效的,因爲你將不得不重複許多where s。

什麼會更好是隻有每個維度的每個單元wheres列表,然後循環通過邏輯組合它們?

+3

'np.where(timeCondition&latCondition&lonCondition)'實際上應該是比要快得多。分別爲每個條件調用'np.where' - 這樣你只能遍歷每個元素一次 –

+0

因此,就效率而言 - 問題在於np.where中重複的個別條件。因此,例如,當循環經度點時,我會有np.where(timeCondition&latCondition&lonCondition1)後接np.where(timeCondition&latCondition&lonCondition2),即必須多次無故搜索timeCondition&latCondition。我想,如果我只是把它們都做了一遍,然後將它們粘在列表中,然後我可以循環比較這些元素,它必須更快。這聽起來不錯嗎? – nrob

+2

根據條件的使用情況,它可以用掩碼乘以掩碼而不是索引。我用它來優化矩陣分解算法中的某些循環,以達到良好效果。 –

回答

3

爲@ali_m說,使用位和要快很多,但要回答你的問題:

  • 電話ravel_multi_index()到多暗淡指數轉換成1調光指數。
  • 致電intersect1d()獲取兩種情況下的索引。
  • 調用unravel_index()將1-dim索引轉換回多偏移索引。

下面是代碼:

import numpy as np 

a = np.random.rand(10, 20, 30) 

idx1 = np.where(a>0.2) 
idx2 = np.where(a<0.4) 

ridx1 = np.ravel_multi_index(idx1, a.shape) 
ridx2 = np.ravel_multi_index(idx2, a.shape) 
ridx = np.intersect1d(ridx1, ridx2) 
idx = np.unravel_index(ridx, a.shape) 

np.allclose(a[idx], a[(a>0.2) & (a<0.4)]) 

,或者你可以直接使用ridx

a.ravel()[ridx] 
+2

你肯定回答了我的問題,但事實證明我以不同的方式解決了問題。我發現最有效的解決方案是跳過np.where方面。即我爲每個維度創建了一個布爾數組的列表,然後將它們與&符號進行邏輯組合。 – nrob