2013-05-16 75 views
5

我在numpy中有一個大的3維數組(可以說大小爲100x100x100)。我想多次遍歷它的一部分(大約70%的元素),並且我有一個相同大小的布爾矩陣,並定義元素是否應該完成操作。如何加速對numpy數組的部分迭代

我的當前方法是首先創建形狀的陣列「COORDS」(N,3),它包含所有的COORDS上其中進行操作,然後

for i in np.arange(many_iterations): 
    for j in coords: 
     large_array[j] = do_something(large_array[tuple(j)]) 

難道實際上是更好評估整個數組並在循環中包含一個額外的操作來測試布爾數組(記住,真實評估然後進行many_iterations次而不是一次)。我的想法是,在這種情況下的回報將擺脫for循環

large_array = do_something(large_array if condition True) 

這最後一行怎麼會在這種情況下工作?

+0

根據'do_something'是什麼,你可以做'large_array [boolean_array] = do_something(large_array [boolean_array])',或者更短的東西。 –

+0

我認爲你的觀點是對的,對整個數組執行操作然後使用類似'numpy.where'的東西可能對你有好處。 –

回答

3

你可能會首先創建布爾數組定義,你應該操作獲得更好的性能:

big_3d_arr = some 100x100x100 array 
where_to_operate_arr = big_3d_arr < 500 # or whatever your condition is 
big_3d_arr[where_to_operate_arr] = do_something(big_3d_arr[where_to_operate_arr]) 

類似的東西可能會奏效,但同樣你可能要重複做以塊的布爾索引,這取決於你的應用程序。

+0

感謝這正是我所需要的。 do_something是一個函數,它獲取數組中的每個元素並使其成爲其周圍元素的平均值(這樣做是爲了複製數組,然後使用一系列np.roll來抵消數組並添加)。我最終決定不使用蒙版,因爲我仍在使用蒙版數據,而且看起來比這個解決方案稍微複雜一些。 – Rowan