numpy的fancy indexing與array masking與不使用迴圈的優勢

參考以下程式:

import numpy as np
rand = np.random.RandomState(360)
x = rand.randint(100, size=10)
print(x)
evenmask=(x%2==0)
print(evenmask)
print(x[evenmask])

輸出:

[64 61 60 66 99  8 34 95  6 91]
[ True False  True  True False  True  True False  True False]
[64 60 66  8 34  6]

其實這是python設計上的特點:能不用迴圈就不用迴圈

WHY? 因為可以提升程式執行效率!!

比較如下:

一、使用numpy的fancy index與array masking,不使用迴圈:

程式:

%%timeit
rand = np.random.RandomState(360)
x = rand.randint(100, size=1000)
y=x[x%2==0]

時間計算結果:
155 µs ± 3.02 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

二、使用list與迴圈:

程式:

%%timeit
rand = np.random.RandomState(360)
x = rand.randint(100, size=1000)
y=[]
for num in list(x):
    if num%2==0:
        y.append(num)

時間計算結果:
416 µs ± 9.12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

所耗費時間是原本的2.68倍