短い答えにはnp.save
and を使用する必要がありnp.load
ます。これらの利点は、それらがnumpyライブラリの開発者によって作成され、すでに機能していることです(さらに、おそらくすでに適切に最適化されています)。
import numpy as np
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
np.save(path/'x', x)
np.save(path/'y', y)
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
print(x is x_loaded) # False
print(x == x_loaded) # [[ True True True True True]]
拡張された答え:
人間が読める形式(このNumPy配列をcsvファイルにダンプする)で保存することも、ファイルが非常に大きい場合は他のライブラリで保存することもできるため(最終的にはnumpy配列を保持する最善の方法を参照)詳細なディスカッションのためにディスク上で)。
ただし、(質問で「適切に」という単語を使用しているため、拡張を行います)numpy関数をそのまま使用すると(そしてほとんどのコード!)、ほとんどのユーザーのニーズを満たすと思います。最も重要な理由は、それがすでに機能していることです。他の理由で他のものを使用しようとすると、予期せぬ長いウサギの穴に行き、それが機能しない理由を理解して強制的に機能させる可能性があります。
たとえば、漬物で保存しようとします。私はそれをただ楽しむために試してみましたが、でバイトモードでファイルを開いて読み取らない限り、pickleがファイルを保存しないことを認識するのに少なくとも30分かかりましたwb
。グーグル、試してみる、エラーメッセージなどを理解するのに時間がかかりました...細かいことですが、複雑なファイルを予期しない方法で開く必要があるという事実。これを追加するには、これをもう一度読む必要がありました(どちらが混乱を招くのでしょうか)組み込みのオープン関数のモードa、a +、w、w +、r +の違い?。
したがって、ニーズに合ったインターフェースがある場合は、(非常に)正当な理由がない限り(たとえば、MATLABとの互換性がある場合や、何らかの理由でファイルを読み取りたい場合や、Pythonでの印刷が本当にニーズに合わない場合)、それを使用してください。疑わしいかもしれません)。さらに、それを最適化する必要がある場合はおそらく、後で説明します(単純なnumpyファイルを開くなど、役に立たないものを何年もデバッグするのではなく)。
したがって、interface / numpyを使用します。それは完璧ではないかもしれません、それはおそらく特に問題があるくらい長い間存在していたライブラリーにとっては問題ないでしょう。
私はすでに多くの方法でnumpyを使用してデータを保存およびロードしましたので、楽しんでください、それが役に立てば幸いです!
import numpy as np
import pickle
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
# using save (to npy), savez (to npz)
np.save(path/'x', x)
np.save(path/'y', y)
np.savez(path/'db', x=x, y=y)
with open(path/'db.pkl', 'wb') as db_file:
pickle.dump(obj={'x':x, 'y':y}, file=db_file)
## using loading npy, npz files
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
db = np.load(path/'db.npz')
with open(path/'db.pkl', 'rb') as db_file:
db_pkl = pickle.load(db_file)
print(x is x_loaded)
print(x == x_loaded)
print(x == db['x'])
print(x == db_pkl['x'])
print('done')
私が学んだことについてのいくつかのコメント:
np.save
予想どおり、これはすでに十分に圧縮されており(https://stackoverflow.com/a/55750128/1601580を参照)、ファイルを開かなくてもそのまま使用できます。掃除。簡単です。効率的。これを使って。
np.savez
は非圧縮形式を使用します(docsを参照)Save several arrays into a single file in uncompressed
.npz format.
これを使用する場合(標準のソリューションから離れるよう警告されたため、バグを予想してください!)デフォルトの名前を使用します。したがって、最初のものがすでに機能している場合は、これを使用しないでください(または、他のすべての機能がそれを使用します!)
- Pickleは、任意のコード実行も可能にします。セキュリティ上の理由でこれを使いたくない人もいるでしょう。
- 人間が読めるファイルは作るのに費用がかかります。たぶん、それだけの価値はありません。
hdf5
大きなファイルに呼ばれるものがあります。涼しい!https://stackoverflow.com/a/9619713/1601580
これは完全な答えではありません。しかし、他のリソースについてはこれを確認してください: