Python
numpy
機械学習

"逐次的np.append"と"list.append+最後にnp.array作成"の速度比較

More than 1 year has passed since last update.

ある1つの生データ(画像等)から得られる特徴量(SIFT特徴量等)の数(≠特徴量次元数)が未知の場合に機械学習をnumpyを使って行う場合には,np.appendをどうしても使いたくなる.
コード例としては以下のようになると思うけど,毎回メモリ確保をしてて違和感がある.

import numpy as np
n_dim = 100
features = np.empty((0, n_dim))
np.random.seed(1)
# np.append
for i in range(10000):
    n_sample = np.random.randint(1, 3)
    features = np.append(features, np.arange(n_sample * n_dim).reshape((n_sample, n_dim)), axis=0)

そこでpythonのlistオブジェクトにappendで各arrayを追加していってやり,最終的に全てのarrayをまとめるという方法を取ってみる.
コードは以下の通り.

import numpy as np
features_list = []
n_dim = 100
n_samples = 0
np.random.seed(1)
# list append
for i in range(10000):
    n_sample = np.random.randint(1, 3)
    features_list.append(np.arange(n_dim * n_sample).reshape((n_sample, n_dim)))
    n_samples += n_sample

# 結果をまとめる
features = np.zeros((n_samples, n_dim))
start = 0
for sub_features in features_list:
    n_sub_samples = sub_features.shape[0]
    features[start:start+sub_features.shape[0],:] = sub_features 
    start += n_sub_samples

%%timeitにより比較を行ってみた所,以下の表のような結果が得られた.

行列作成方法 計算速度
np.append 37.3s
list.append+np.array 67.7ms

可読性は低下するものの,速度向上は550倍と全く無視できない.