2017-10-17 108 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

当然,但您的答案是“使用”我设置的特定条件。在某些情况下,尽管这种情况可能非常复杂(或者甚至可能不是一个条件),所以我想知道是否有更通用的解决方案来避免这些类型的循环。 –