そこでnp.appendをlist appendに変換すると早いと知り
誰だ、そんなこと言ったの・・・まあ確かに、ループのたびにオブジェクト作り直しで足していくよりは速いかもしれませんが。
「最初から(n_loops,100,200)の配列を用意すれば良い」という指摘がすでに上がっていますが、とりあえず、配列の連結がどうしても必要なら、
python
1import time
2import numpy as np
3
4data = np.empty((1,100,200))
5n_loops = 1000
6
7# np.append
8start_time = time.time()
9for _ in range(n_loops):
10 bbb = np.random.randint(low=1, high=5,size=1*100*200).reshape(1,100,200)
11 data = np.append(data, bbb, axis=0)
12end_time = time.time()
13print(data.shape)
14print(str(end_time - start_time) + ' [sec]') #print calculation time
15""" =>
16(1001, 100, 200)
1725.065351009368896 [sec]
18"""
19
20# listに入れてまとめてnp.concatenate
21start_time = time.time()
22lst = []
23for _ in range(n_loops):
24 bbb = np.random.randint(low=1, high=5,size=1*100*200).reshape(1,100,200)
25 lst.append(bbb)
26data = np.concatenate(lst, axis=0)
27end_time = time.time()
28
29print(data.shape)
30print(str(end_time - start_time) + ' [sec]') #print calculation time
31""" =>
32(1000, 100, 200)
330.22292709350585938 [sec]
34"""
listに入れておいて、最後にまとめてnp.concatenate
を呼ぶ。これで実用的な速度になるでしょう。
追記
python
1# 空の配列を先に定義しておく
2data = np.empty((n_loops,100,200))
3start_time = time.time()
4for i in range(n_loops):
5 bbb = np.random.randint(low=1, high=5,size=1*100*200).reshape(1,100,200)
6 data[i] = bbb
7end_time = time.time()
8
9print(data.shape)
10print(str(end_time - start_time) + ' [sec]') #print calculation time
11""" =>
12(1000, 100, 200)
130.16308903694152832 [sec]
14"""
こっちの方が速い・・・かな?