web-dev-qa-db-ja.com

numpy配列のh5pyへの入出力

出力がPythonコードである enter image description here エントリがすべてfloatタイプであるサイズのマトリックス。拡張子.datを付けて保存すると、ファイルサイズは500 MB程度になります。 h5pyを使用すると、ファイルサイズがかなり小さくなることを読みました。したがって、Aという名前の2D numpy配列があるとします。 h5pyファイルに保存するにはどうすればよいですか?また、配列を操作する必要があるので、同じファイルを読み取って別のコードのnumpy配列として配置するにはどうすればよいですか?

84
lovespeed

h5pyは、datasetsおよびgroupsのモデルを提供します。前者は基本的に配列であり、後者はディレクトリと考えることができます。それぞれに名前が付けられています。 APIとサンプルのドキュメントをご覧ください:

http://docs.h5py.org/en/latest/quick.html

すべてのデータを事前に作成し、それをhdf5ファイルに保存するだけの簡単な例は次のようになります。

In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">

In [6]: h5f.close()

その後、次を使用してそのデータを再び読み込むことができます。

In [10]: h5f = h5py.File('data.h5','r')
In [11]: b = h5f['dataset_1'][:]
In [12]: h5f.close()

In [13]: np.allclose(a,b)
Out[13]: True

間違いなくドキュメントをチェックしてください:

http://docs.h5py.org

Hdf5ファイルへの書き込みは、h5pyまたはpytablesのいずれかに依存します(それぞれに、hdf5ファイル仕様の上にある異なるpython AP​​Iがあります)。また、np.savenp.savezなど、numpyがネイティブで提供する他の単純なバイナリ形式も確認する必要があります。

http://docs.scipy.org/doc/numpy/reference/routines.io.html

119
JoshAdel

クリーンな方法 ファイルのオープン/クローズを処理し、メモリリークを回避します。

Prep:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such

書き込み:

with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)

読み取り:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]
86
Lavi Avigdor