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回目 | 平均 | |
ifmask | 5.02 | 4.75 | 4.92 | 4.90 |
numpymask | 123 | 124 | 124 | 124 |
今回は、以上です。最後までよんでいただきありがとうございました!
コメント