この記事では科学技術計算をやる上で計算結果を保存するフォーマットの1つであるHDF5、そしてPythonでHDF5を取り扱うことのできるH5pyとその基本的な使い方について紹介していきます。
HDF5とは?
HDF5とはHierarchical Data Formatの略で、直訳すると階層的なデータフォーマットということになります。普段、Pythonのプログラムで出てきた結果(数値データ)をどのように保存していますか?
例えば、時刻tの時に、numpyアレー A, B, Cという結果があったとしましょう。一つの出力方法としては時刻tというフォルダを作成して、そこにA, B, Cのnumpyアレーを個別に保存するという方法が考えられますね。イメージとしては次のようなイメージです。
もちろん、このやり方でも問題無いとは思います。しかし、この方法の場合、トータルのフォルダ数やファイル数がかなり増えてしまうので、ファイルをどこかにコピーしたり持ち出すような場合にかなり面倒だという事は想像に難くありません。
実はHDF5を用いると、このフォルダ毎にファイルを分けるというような階層構造をファイルの中で実現する事が可能です。HDF5で同じことをした場合は次のようになります。
つまり、data.hdf5というファイルの中にフォルダがあるようなイメージですね。この為、階層的なデータ構造になっています。これだと1つのファイルに計算結果を一元管理できるのと入出力も速いので、個人的には重宝しています。この、HDF5フォーマットでの入出力をPythonで行うためのライブラリがH5pyです。
H5pyの使い方
まずファイルのimportは次のように行います。
import h5py
ファイルの書き込み
ファイルの書き込みは通常のファイルと同じくwith構文で開いて、そこに書き込んでいく形で使います。ここでは例として3つのnumpyアレーを1つのdata.hdf5というファイルに保存してみます。
import numpy as np
import h5py
arrA = np.arange(10)
arrB = np.arange(10)
arrC = np.arange(10)
def output_arr(file_path, time, arrA, arrB, arrC):
with h5py.File(file_path, "a") as f:
grp = f.create_group("{:010}".format(time))
grp.create_dataset("data A", data=arrA)
grp.create_dataset("data B", data=arrB)
grp.create_dataset("data C", data=arrC)
output_arr("./data.hdf5", 10, arrA, arrB, arrC)
ここではt = 10の時にarrA, B, Cという3つのnumpy アレーをdata.hdf5に保存しています。f.create_groupという関数を使って、グループを作成し、キー, 値という順で保存します。ここでは[‘0000000010’]の下に”data A”, “data B”, “data C”の3つのデータが保存されています。つまり、階層的なデータ構造になっているわけですね。
ファイルの読み込み
def read_arr(file_path, t, data_type):
with h5py.File(file_path, "r") as data:
data_list = list(data)
print(data_list)
data_arr = data[data_list[t]][data_type][()]
return data_arr
read_arr("./data.hdf5", 0, "data A")
ファイルの読み込みは, 属性を”r”で読み込み、list(data)とすると、最初の階層のtのリストが返ってきます。このキーを使ってより下の構造のデータにアクセスします。例えば、今回の場合、t=10の時のdata Aにアクセルする場合は、data[‘0000000010’][“data A”]のような形でアクセスする事になります。その後の、[()]はデータにアクセスするためのおまじないだと思ってください。(*昔は.valuesという関数を呼び出していましたが、今は非推奨)
いかがでしたでしょうか?h5pyの使い方はこの2つがほとんでとても簡単ではないかと思います。このHDFフォーマットはh5pyで読み書きする他、HDF5用のviewerも存在します。詳細はHDFViewなど検索頂ければと思います。
最新記事 by t-tetsuya (全て見る)
- 【GPyOpt】Python x ベイズ最適化の基本をマスターしよう - 2020年12月29日
- Python print関数の基本の使い方 - 2020年12月10日
- Python関数の書き方の基本 - 2020年12月1日
・PythonでHDF5を取り扱うH5pyの使い方
について理解することができます。