5

でこぼこで:

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

また、配列の形状/構造を同じままにしたいので、 Foo[np.nonzero(Foo)] は機能しないと思います...

numpyでこれを行うにはどうすればよいですか?

ありがとう!

4

2 に答える 2

11
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]])
于 2012-11-24T18:41:36.067 に答える
2

次のようにその場で行うこともできます

>>> 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]])
>>>
于 2012-11-24T18:49:28.797 に答える