117

条件が満たされた場合に各要素が 1 または 0 に変更されるように操作する必要がある大きな numpy 配列があります (後でピクセル マスクとして使用されます)。配列には約 800 万の要素があり、現在の方法ではリダクション パイプラインに時間がかかりすぎます。

for (y,x), value in numpy.ndenumerate(mask_data): 

    if mask_data[y,x]<3: #Good Pixel
        mask_data[y,x]=1
    elif mask_data[y,x]>3: #Bad Pixel
        mask_data[y,x]=0

これを高速化するnumpy関数はありますか?

4

5 に答える 5

151
>>> import numpy as np
>>> a = np.random.randint(0, 5, size=(5, 4))
>>> a
array([[4, 2, 1, 1],
       [3, 0, 1, 2],
       [2, 0, 1, 1],
       [4, 0, 2, 3],
       [0, 0, 0, 2]])
>>> b = a < 3
>>> b
array([[False,  True,  True,  True],
       [False,  True,  True,  True],
       [ True,  True,  True,  True],
       [False,  True,  True, False],
       [ True,  True,  True,  True]], dtype=bool)
>>> 
>>> c = b.astype(int)
>>> c
array([[0, 1, 1, 1],
       [0, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 1, 1, 0],
       [1, 1, 1, 1]])

これを次のように短縮できます。

>>> c = (a < 3).astype(int)
于 2013-11-04T11:45:58.043 に答える
-5

私はあなたの質問を理解したかどうかわかりませんが、あなたが書いた場合:

mask_data[:3, :3] = 1
mask_data[3:, 3:] = 0

これにより、x および y インデックスが 3 未満のマスク データのすべての値が 1 に等しくなり、残りのすべての値が 0 に等しくなります。

于 2013-11-04T11:49:02.387 に答える