0

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 

上記の二重ループの代わりに単一行コードを使用することは可能ですか? そしておそらくそれをより速くしますか?

4

2 に答える 2

3

方法 #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]])

これは 2 回計算a > 1されますが、代わりに変数に割り当てることもできます。(もちろん、実際にはボトルネックになる可能性はほとんどありませんが、aメモリが十分に大きい場合は問題になる可能性があります。)

方法 #2: 使用np.where:

>>> 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 > 11 回だけ計算しますが、OTOHは本当に必要な要素だけを計算するのではなく、(ax-3)*5のすべての要素axを計算します。a

于 2013-05-07T03:59:13.390 に答える
0
for index, x in np.ndenumerate(a):
    if x > 1:
        a[index] = (a[index] - 3) * 5
于 2013-05-07T03:53:00.353 に答える