[Python]マスクを使った処理

Pythonコードをある程度高速に実行するためには、明示的なループを減らすことが大事になってきます。そこで、今回はnumpy配列をある条件に従って特定の値を代入する関数を作ってみます。
具体的には、あるTrue/FalseからなるNumPy配列を保持することでマスク処理をしてみます。

import numpy as np
x=np.random.rand(4)
print(x)
mask = (x<0.5)
print(mask)

実行結果は、下記になります。

[0.6684 0.7071  0.6681  0.3186]
[False False False  True]

利用法方法ですが、例えばある閾値より下の場合は0とするという使い方ができます。

x[mask]=0
print(x)

実行結果です。確かに、0.5未満のものが0となっています。

[0.6684 0.7071  0.6681  0.]

ここで、forループと比較してどの程度早くなるのか実験してみます。

import numpy as np
import time

def numpymask(x):
    mask=(x<=0.5)
    x[mask]=0

def ifmask(x):
    for i in range(0,x.size):
        if x[i] <= 0.5:
            x[i]=0   

if __name__ == '__main__':
    x = np.random.rand(1000000000)
    start_filter = time.time()
    ifmask(x)
#     numpymask(x)
    elapsed_time = time.time() - start_filter
    print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

下記のようになりました。実行時間で25倍くらい違います。Pythonのforループ辛いです。計測しているときも、割と時間がかかってイライラしました。イライラはプログラマーの大敵です。駆逐してやりましょう。

1回目2回目3回目平均
ifmask5.024.754.924.90
numpymask123124124124
 実行時間 Unit[s]

今回は、以上です。最後までよんでいただきありがとうございました!

コメント

タイトルとURLをコピーしました