Python numpy只对非零部分执行函数,同时保留数组的结构

Python numpy只对非零部分执行函数,同时保留数组的结构,python,numpy,Python,Numpy,在努比: Foo = array([[ 3.5, 0. , 2.5, 2. , 0. , 1. , 0. ], [ 0. , 3. , 2.5, 2. , 0. , 0. , 0.5], [ 3.5, 0. , 0. , 0. , 1.5, 0. , 0.5]]) 我想在Foo上执行一个函数,以便只更改非零元素,即对于f(x)=x(非零)+5: 我还希望数组的形状/结构保持不变,所以我认为Foo[np.nonzero(Foo)]

在努比:

Foo = 
array([[ 3.5,  0. ,  2.5,  2. ,  0. ,  1. ,  0. ],
       [ 0. ,  3. ,  2.5,  2. ,  0. ,  0. ,  0.5],
       [ 3.5,  0. ,  0. ,  0. ,  1.5,  0. ,  0.5]])
我想在Foo上执行一个函数,以便只更改非零元素,即对于f(x)=x(非零)+5:

我还希望数组的形状/结构保持不变,所以我认为Foo[np.nonzero(Foo)]不会起作用

在努比我该怎么做


谢谢

您也可以按如下方式就地执行

In [138]: foo = np.array([[ 3.5,  0. ,  2.5,  2. ,  0. ,  1. ,  0. ],
                          [ 0. ,  3. ,  2.5,  2. ,  0. ,  0. ,  0.5],
                          [ 3.5,  0. ,  0. ,  0. ,  1.5,  0. ,  0.5]])
In [141]: mask = foo != 0

In [142]: foo[mask] = foo[mask]+5

In [143]: foo
Out[143]: 
array([[ 8.5,  0. ,  7.5,  7. ,  0. ,  6. ,  0. ],
       [ 0. ,  8. ,  7.5,  7. ,  0. ,  0. ,  5.5],
       [ 8.5,  0. ,  0. ,  0. ,  6.5,  0. ,  5.5]])
>>> import numpy as np
>>> foo = np.array([[ 3.5,  0. ,  2.5,  2. ,  0. ,  1. ,  0. ],
...                           [ 0. ,  3. ,  2.5,  2. ,  0. ,  0. ,  0.5],
...                           [ 3.5,  0. ,  0. ,  0. ,  1.5,  0. ,  0.5]])
>>> foo[foo!=0] += 5
>>> foo
array([[ 8.5,  0. ,  7.5,  7. ,  0. ,  6. ,  0. ],
       [ 0. ,  8. ,  7.5,  7. ,  0. ,  0. ,  5.5],
       [ 8.5,  0. ,  0. ,  0. ,  6.5,  0. ,  5.5]])
>>>

啊,我太痴迷于np.nonzero函数了,以至于我忘记了简单的布尔数组。非常感谢。
>>> import numpy as np
>>> foo = np.array([[ 3.5,  0. ,  2.5,  2. ,  0. ,  1. ,  0. ],
...                           [ 0. ,  3. ,  2.5,  2. ,  0. ,  0. ,  0.5],
...                           [ 3.5,  0. ,  0. ,  0. ,  1.5,  0. ,  0.5]])
>>> foo[foo!=0] += 5
>>> foo
array([[ 8.5,  0. ,  7.5,  7. ,  0. ,  6. ,  0. ],
       [ 0. ,  8. ,  7.5,  7. ,  0. ,  0. ,  5.5],
       [ 8.5,  0. ,  0. ,  0. ,  6.5,  0. ,  5.5]])
>>>