numpy
前回、リストで関数の結果を取得できるmap関数を紹介しました。
今回はnumpyのリストに要素を追加する方法を紹介します。
いつもは普通のリストを作って、「np.array(リスト)」でnumpyのリストに変換していましたが、ひょんなことからnumpyのリストに要素を追加する機会があって、どうやるんだっけ、そういえば知らなかったとなったのが今回の発端です。
例えば普通のリストに要素を入れるのは「append」を使ってこんな感じ。
val_list = []
for i in range(10):
val_list.append(i*i)
print(val_list)
実行結果
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
これをnumpyでやるとどうなるのでしょうか。
それでは始めていきましょう。
numpyの要素の追加:np.append
実はnumpyの要素の追加も「append」です。
ただし使い方が違います。
通常のリストの場合、「リスト.append(追加する要素)」ですが、numpyのリストの場合、「np.append(リスト, 追加する要素)」です。
なので先ほどの例をnumpyのリストを使ったプログラムに置き換えるとこうなります。
import numpy as np
val_list = np.array([])
for i in range(10):
val_list = np.append(val_list, i*i)
print(val_list)
実行結果
[ 0. 1. 4. 9. 16. 25. 36. 49. 64. 81.]
速度の比較
numpyのリストに追加する方法の解説はこれだけなのですが、通常のリストとの速度の比較をしてみました。
なんとなくnumpyは速いという頭があったので、どれくらい速いのかなというのを実感したかったわけです。
速度の比較はマジックコマンドの「%%timeit」を使いました。
まずは通常のリストへの要素の追加から。
%%timeit
val_list = []
for i in range(10000):
val_list.append(i*i)
実行結果
915 µs ± 11.4 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
次にnumpyのリストへの追加。
%%timeit
import numpy as np
val_list = np.array([])
for i in range(10000):
val_list = np.append(val_list, i*i)
実行結果
58.9 ms ± 1.93 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
なんとも予想に反して、numpyのリストへの追加の方が50倍程度遅いという結果になってしまいました。
試しにもう一つ。
numpyのリストを掛け算すると同じインデックスの要素を掛け合わせて新しいリストを作ってくれます。
ということでrangeで同じリストを2つ作ってから、numpyのリストにして、掛け合わせてみましょう。
%%timeit
import numpy as np
x_list = np.array(range(10000))
y_list = np.array(range(10000))
val_list = x_list * y_list
実行結果
1.61 ms ± 39.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
こうするとだいぶ時間が短くなりましたが、簡単な計算の場合、numpyを使わない方が速いようです。
なかなか普段numpyを使わないので、勉強になりましたし、速度を計測する大切さもわかった気がします。
次回はnumpyのリストの順番をずらす「np.roll」を紹介します。
ではでは今回はこんな感じで。
コメント