Numpy only performs a function on non-zero parts, while preserving the structure of the array

In 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]]) 

I want to execute a function on Foo so that only non-zero elements change, i.e. for f (x) = x (nonzero) +5:

 array([[ 8.5, 0. , 7.5, 7. , 0. , 6. , 0. ], [ 0. , 8. , 8.5, 7. , 0. , 0. , 5.5], [ 8.5, 0. , 0. , 0. , 6.5, 0. , 5.5]]) 

Also, I want the shape / structure of the array to remain unchanged, so I don't think Foo [np.nonzero (Foo)] will work ...

How to do it in numpy?

thanks!

+4
source share
2 answers
 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]]) 
+6
source

you can also do it as follows

 >>> 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]]) >>> 
+2
source

All Articles