0

たとえば、形状が (10,10) の Numpy nd.array があるとします。

import numpy as np
a = np.linspace(-1,1,100).reshape(10,10)

最初の要素がゼロより小さい場合にのみ、各行の最初の要素で計算を実行したいと思います。これを行うために、マスクされた配列を使用することを考えていました。

a = np.ma.MaskedArray(a,mask=(np.ones_like(a)*(a[:,0]<0)).T)

>>> (np.ones_like(a)*(a[:,0]<0)).T
array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
   [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

これにより、最初の要素が 0 未満の行に対してのみ計算を実行できます (この例では、これらの行の他の要素も負であることが偶然ですが、最初の要素のみの場合をテストしました)。要素は負で、他の要素は正です)。この時点でいくつか質問があります。

1) 計算を実行する最初の列を除くすべての列をカバーするために追加のマスクを追加する必要があります (例を具体的にするために: その要素がゼロより小さい各行の最初の要素に 1000 を追加したい) ?

2) アレイのマスキングは永続的ですか? アンマスク方法はありますか?

3) これは、この種の計算を実行する最も簡単な方法ですか?

任意の提案をいただければ幸いです。ありがとう!

4

2 に答える 2

1

私の意見では、マスクされた配列を使用することは、このような比較的単純なことを行うには少しやり過ぎに思えます。私はそれを行うために numpy の派手なインデックス作成を使用します:

#get indices of rows to update
rowsToUpdate = np.nonzero(a[:,0]<0)[0]
#increment first element of target rows by 1000
a[rowsToUpdate,0] += 1000
于 2013-08-17T06:52:04.787 に答える