2017-10-17 120 views
2

如何迭代n維的numpy陣列並創建一個類似形狀的新陣列。在n維numpy陣列上迭代時創建新陣列

例如用於輸入:

import numpy as np 

arr = np.array([[1,2,3], 
       [4,5,6], 
       [7,8,9], 
       [0,0,0]]) 
alpha = 3. 
median = np.median(arr) 

我想建立的相同(4,3)的新陣列設置爲1的隨機條件標誌。 例如

flag = (arr[i,j] > median - alpha) or (arr[i,j] < median + alpha) 

我將與2解決這個for語句

flags = arr * 0 
for i in range(arr.shape[0]): 
    for j in range(arr.shape[1]): 
     flags[i,j] = (arr[i,j] > median - alpha) or (arr[i,j] < median + alpha) 

是否有一個更簡單,更高效的Python的的方式來解決這個問題的方法嗎?該解決方案理想情況下也適用於n維陣列(1,2,... n維)

+0

嗯,現在你正在生成'True'標誌,除非'arr [i,j] == median * alpha'。那是你要的嗎? –

+0

的確,這只是一個例子。我所問的是迭代過程。我會更新條件,使之更有意義 –

回答

5

根本不需要迭代。

np.logical_or(arr < median - alpha, arr > median + alpha) 
1

numpy的做是爲了避免循環:

alpha = 3. 
median = np.median(arr) 

abs(arr-median) < alpha 

#array([[ True, True, True], 
#  [ True, True, True], 
#  [False, False, False], 
#  [False, False, False]], dtype=bool) 

當然,它適用於任何數量的維度。

更一般地說,每次您可以用numpy logic functions來制定條件時,都可以避免出現循環。 Python 運算符不會在numpy數組上映射,並且使用它們意味着循環和減速。

+0

當然,但您的答案是「使用」我設置的特定條件。在某些情況下,儘管這種情況可能非常複雜(或者甚至可能不是一個條件),所以我想知道是否有更通用的解決方案來避免這些類型的循環。 –