numpy配列をh5pyに入出力


100

出力がここに画像の説明を入力してくださいサイズ指定された行列で、エントリがすべてtypeであるPythonコードがありますfloat。拡張子を付けて保存すると、.datファイルサイズは500 MB程度になります。を使用h5pyすると、ファイルサイズが大幅に縮小されることを確認しました。したがって、という名前の2D numpy配列があるとしAます。どうすればh5pyファイルに保存できますか?また、配列を操作する必要があるので、同じファイルを読み取って、それを別のコードの派手な配列として配置するにはどうすればよいですか?


4
.dat拡張機能でどのように保存していますか?
jorgeca 2014年

@jorgeca:そのために私はただnp.savetxt("output.dat",A,'%10.8e')
lovespeed 2014年

3
ありがとう(拡張子だけではあまり意味がありません。バイナリ、アスキーとして保存できます...)。hdf5の追加機能が必要でない限り、np.save('output.dat', A)それを使用してバイナリ形式で保存します(はるかに高速で、使用されるスペースがはるかに少なくなります)。
ジョルジェカ2014年

@jorgecaですが、別のpythonスクリプトは、2D配列としてそれを呼び出すことができますA = np.loadtxt('output.dat',unpack=True)
lovespeed

2
これh5pyより小さいファイルは作成されませんnp.saveでしょうか?あるh5pyよりも早くnp.save質問に与えられた大きさの配列のために?
dbliss 2015

回答:


131

h5pyは、データセットグループのモデルを提供します。前者は基本的に配列であり、後者はディレクトリと考えることができます。それぞれに名前が付けられています。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 APIがあります)。また、numpyによってネイティブで提供されている他の単純なバイナリ形式np.savenp.savezなど)も確認する必要があります。

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


ところで 読みながら、あなたが事前にデータセットの名前がわからない場合、あなたは次のようにHDFファイル解析する必要があり、ここを
Trilarion

データセットに列を追加する場合は@JoshAdel。私のデータセットは、[img_id、rows、colums、channels]としてインデックス付けされた多次元np.arrayです。そして私はあなたの答えに記載された方法を使用してそれを保存しました。h5f ['dataset_1'] [img_id]を使用して、データセット内のすべてのポイントにアクセスします。私が欲しいのは、別の列を追加する方法です 'mycolumn' ...データセット内のすべてのimg_idに対応しています。これに別の列を追加して、h5f ['mycolumn'] [img_id]を実行するにはどうすればよいですか?
iratzhash 2016年

このような行列を作成すると、HDFView 2.11でそれらを表示できません-ファイルを開くことができます。データセットdata.h5が存在することはわかりますが、HDFViewでは表示できません。h5pyで内容を読み取ることはできますが、HDFViewで検査することはできません。なぜか?
Martin Thoma

104

ファイルのオープン/クローズを処理し、メモリリークを回避するためのよりクリーンな方法

準備:

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'][:]

2
ファイルを閉じる必要はありませんか?
ricoamor 2017

22
@DrDeSanchoいいえ、withステートメント
Leonid

1
インタラクティブモードで実行する場合に特に便利です(最初の試行で適切に閉じずに同じコードを再実行すると、既に開いているファイルについてh5pyから例外が発生するリスクがあるため)
Andre Holzner

withPython の機能は、コンテキストマネージャとして知られています。それはそれが使用された後にファイルが閉じられていることを確認します。詳細については公式ドキュメントをご覧ください:docs.python.org/3/library/contextlib.html
マーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.