1

配列があり、別の配列を使用した分類に基づいて要素を変更したいと考えています。

つまり、1 つの配列をインポートし、cell[i,j] の値が特定の制限内 (たとえば 1 ~ 8) の場合は、secondArray[i,j] に 0.3 を掛けて、結果を出力配列に入れます。場所 [i,j]

私はこれを行うコードをいくつか持っています (そして、おそらく私が意味することをもう少し明確に説明しています) が、「非常に」長い時間がかかり (私の配列は約 1000*1000 要素であるため)、より効率的な解決策があるかどうか疑問に思いました。

現在私は持っています:

..
import numpy as np

def Factor_AM(cell):            
    if cell < 1     return 0.2;
    elif cell < 8:      return 0.3;
    else:       return 0.5;



mat = np.array(..some code to get an array from an external source..) //size 1000*1000
mat_out_1 = np.zeros_like(mat)
mat_out_1 = np.zeros_like(mat)

mat_ClassifyMe = np.array(..some code to import another 1000*1000 array with values in)

for index, x in np.ndenumerate(mat):
    mat_out_1[index] = Factor_AM(x) * mat_ClassifyMe[index]
    mat_out_2[index] = (1-Factor_AM(x)) * mat_ClassifyMe[index]

..some code to output mat_out_1 and mat_out_2

np.where および np.argwhere 関数に関するいくつかのドキュメントを見ましたが、これは有望に見えますが、複数のテストがある場合 (上記のコードでは 3 つですが、実際には 12 あります)、それなしでは方法を考えられません。非常に醜いネストされたステートメントを作成します。

これを行う別の方法はありますか、それとも Python と同じくらい効率的ですか?

4

2 に答える 2

1

この目的のために、ブール値または「マスク」インデックス配列を使用できます。次に例を示します。

import numpy as np

mat = np.arange(16.0).reshape((4,4))

mat_out = np.zeros_like(mat)

mat_out[mat < 6] = 0.2 * mat[mat < 6]  # using a conditional for indexing
# or use a variable for the boolean 'masking' index array
mask1 = np.logical_and(mat >= 6, mat < 10)
mat_out[mask1] = 0.3 * mat[mask1]
mask2 = mat >= 10
mat_out[mask2] = 0.5 * mat[mask2]

print mat
print mat < 6
print mask1
print mat_out
于 2013-05-08T09:59:12.073 に答える