【H5py】科学技術計算向けのファイル入出力

 この記事では科学技術計算をやる上で計算結果を保存するフォーマットの1つであるHDF5、そしてPythonでHDF5を取り扱うことのできるH5pyとその基本的な使い方について紹介していきます。

この記事を読むことであなたは
・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など検索頂ければと思います。

The following two tabs change content below.
メーカーR&D職 研究開発業務にPythonを使用。 Udemy講師およびKindleで電子書籍を出版。 Udemyでは受講生 約15,000名 Pythonの適用範囲: データ分析、画像処理、統計解析、並列計算、流体解析、深層学習