[python] numpyのhstack(np.r_)が遅いので逐次出力で高速化

np.c_(np.hstack)やnp.r_(np.vstack)が遅かったので対処メモ。

例えば、outという配列に、同じ列数のnumpy arrayもしくはint(Error時用)が詰まっているとして、
import numpy as np
...
flag=0
outdata=None
for data in out:
if type(data) is int:
continue

if flag==0:
outdata=data
flag=1
else:
outdata=np.r_[outdata, data]
np.save(outf, outdata)
とするとむちゃくちゃ遅いが、最初から(Errorでない場合の)列の数がNだとわかっていれば、一度バイナリに文字列として出力して整形した方がぐっと早くなった(データの大きさや環境にもよるが1日→数時間くらい)。

import numpy as np
import os
...
with open(outf, mode='wb') as ff:
    for p in out:
        if type(p) is not int:
            for pp in p:
                ff.write('\n'.join(pp.astype("str").tolist()))
                ff.write('\n')
with open(outf) as ff:
    data=ff.read()
data=np.array(data.splitlines()).astype(float)
outdata=data.reshape(data.size/N, N)

np.save(outf, outdata)
os.remove(outf)
大量のデータを扱う場合は後者を試してみると良いかもしれない。

コメント

このブログの人気の投稿

旧バージョンのiMovieを入れる方法

TWRP公式サポートされてないAndroid端末でシステムインストールした話

[UTAU] Garagebandで作ったボーカルメロディーをUTAUに読ませる