Python 如何迭代Numpy数组并仅在元素符合条件时执行计算?

Python 如何迭代Numpy数组并仅在元素符合条件时执行计算?,python,numpy,Python,Numpy,我想迭代一个numpy数组,只处理符合特定条件的元素。在下面的代码中,我只想在元素大于1时执行计算 a = np.array([[1,3,5], [2,4,3], [1,2,0]]) for i in range(0, a.shape[0]): for j in range(0, a.shape[1]): if a[i,j] > 1: a[i,j] = (a[i,j] - 3) * 5

我想迭代一个numpy数组,只处理符合特定条件的元素。在下面的代码中,我只想在元素大于1时执行计算

a = np.array([[1,3,5],
              [2,4,3],
              [1,2,0]])

for i in range(0, a.shape[0]):
    for j in range(0, a.shape[1]):
        if a[i,j] > 1:
            a[i,j] = (a[i,j] - 3) * 5 
是否可以使用单行代码而不是上面的双循环?也许能让它更快?

方法1:使用布尔数组索引:

for index, x in np.ndenumerate(a):
    if x > 1:
        a[index] = (a[index] - 3) * 5
>>> a = np.array([[1,3,5], [2,4,3], [1,2,0]])
>>> a[a > 1]  = (a[a > 1] - 3) * 5
>>> a
array([[ 1,  0, 10],
       [-5,  5,  0],
       [ 1, -5,  0]])
这会计算两次
a>1
,不过您可以将其分配给变量。(在实践中,这当然不太可能成为瓶颈,尽管如果
a
足够大,内存可能会成为一个问题。)

方法2:使用
np。其中

>>> a = np.array([[1,3,5], [2,4,3], [1,2,0]])
>>> np.where(a > 1, (a-3)*5, a)
array([[ 1,  0, 10],
       [-5,  5,  0],
       [ 1, -5,  0]])
这只计算
a>1
一次,但OTOH为
a
中的每个元素
ax
计算
(ax-3)*5
,而不是只对真正需要它的元素进行计算。

方法1:使用布尔数组索引:

>>> a = np.array([[1,3,5], [2,4,3], [1,2,0]])
>>> a[a > 1]  = (a[a > 1] - 3) * 5
>>> a
array([[ 1,  0, 10],
       [-5,  5,  0],
       [ 1, -5,  0]])
这会计算两次
a>1
,不过您可以将其分配给变量。(在实践中,这当然不太可能成为瓶颈,尽管如果
a
足够大,内存可能会成为一个问题。)

方法2:使用
np。其中

>>> a = np.array([[1,3,5], [2,4,3], [1,2,0]])
>>> np.where(a > 1, (a-3)*5, a)
array([[ 1,  0, 10],
       [-5,  5,  0],
       [ 1, -5,  0]])

这只计算
a>1
一次,但对于
a
中的每个元素
ax
,OTOH计算
(ax-3)*5
,而不是只为那些真正需要它的元素这样做。

你有没有关于括号内运算符的用法的参考work@user1276363:我想它被调用了,但由于某些原因,我无法连接到我要链接到的numpy教程。如果您关心内存,它看起来像np。where返回一个新数组,方法#1在适当的位置进行计算,您是否有关于括号内运算符如何计算的参考work@user1276363:我想它被调用了,但由于某些原因,我无法连接到我将要链接到的numpy教程。如果您关心内存,它看起来像np。where返回一个新数组,而方法#1则原地求值