やりたいこと
はじめに空の配列を宣言しておいて、for文を使って順番に値を入れていきたいときがある。
リストの場合
l = []
for i in range(10):
l.append(i) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
リストの場合はこのように書けば良いが、numpyではどう書けばいいか?
ググってもあんまり出てこなかったのでメモとして情報を残しておく。
numpyの場合
array = np.empty(0)
for i in range(10):
array = np.append(array, i)
#array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
実行速度比較
range(10000)
で実行速度を比較してみた。
list
%%timeit
l = []
for i in range(10000):
l.append(i)
#532 µs ± 16.2 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
numpy
%%timeit
array = np.empty(0)
for i in range(10000):
array = np.append(array, i)
#57.8 ms ± 2.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
空配列に順番に値を入れていくのであれば、listのほうが約100倍高速である。listで配列を追加していって、最後にndarrayに変換する場合は、
%%timeit
l = []
for i in range(10000):
l.append(i)
l_np = np.array(l)
#1.17 ms ± 29.7 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
予め配列のサイズが分かっているのであれば、np.zeros()
を使用してはじめに要素を持ったndarray
を用意するほうが高速に動作する。
%%timeit
array = np.zeros(10000)
for i in range(10000):
array[i] = i
#978 µs ± 31 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)