我有一些物理模擬代碼,用python編寫並使用numpy/scipy。分析代碼顯示38%的CPU時間花費在一個雙重嵌套的循環中 - 這看起來過多,所以我一直試圖減少它。在numpy中創建索引數組 - 消除循環的雙重
該循環的目標是創建一個索引數組,顯示2D數組的元素與一維數組的哪些元素相等。
indices[i,j] = where(1D_array == 2D_array[i,j])
舉個例子,如果1D_array = [7.2, 2.5, 3.9]
和
2D_array = [[7.2, 2.5]
[3.9, 7.2]]
我們應該有
indices = [[0, 1]
[2, 0]]
我現在有這個實現
for i in range(ni):
for j in range(nj):
out[i, j] = (1D_array - 2D_array[i, j]).argmin()
的因爲我正在處理浮點數,所以需要,所以平等不一定是確切的。我知道1D數組中的每個數字都是唯一的,並且2D數組中的每個元素都有匹配,所以這種方法可以給出正確的結果。
有沒有什麼方法可以消除雙循環?
注:
我需要的索引陣列以執行下列操作:
f = complex_function(1D_array)
output = f[indices]
這比替代速度更快,因爲2D陣列的大小爲N×N的具有1×N個爲比較1D陣列和2D陣列具有許多重複值。如果任何人都可以提出在相同的輸出到達,而無需通過索引陣列中會以不同的方式,這也可能是一個解決辦法
'1D_array'總是排序嗎? –
@AshwiniChaudhary,不,不是。事實上,它永遠不會。我將編輯該示例以刪除該示例。 – Sten
爲了達到這個目的,我認爲1D_array中的條目不會重複。爲什麼不用1D_array創建一個字典,其中的值作爲鍵和索引作爲值?即'{0:7.2,1:2.5,2:3.9}'那麼你只需要將字典應用到數組。 – Roberto