「HDF5(エッチディーエフ ファイブ)」は、
階層構造や付属情報のあるデータを、数値データと一緒に格納しておけるデータ形式です。
Hierarchical Data Format version 5 (ヒエラルキカル データ フォーマット バージョン5)の略で、
拡張子が「.h5」や「.hdf5」のファイルになります。
HDF5 は、ディープラーニングなどのデータセットのファイルとしても使われており、
人工知能や機械学習を扱っていきたい場合にも、知っておくと役立つ知識となります。
というわけで、本シリーズでは、
HDF5 について
- HDF5の「データセット(dataset)」
- HDF5 の「グループ(Groups)」
- HDF5 の「アトリビュート(Attribute 属性)」
のプログラミングのやり方について、
サンプルコードを示しながら、サクッとわかりやすく解説したいと思います。
というわけで、本記事では、
HDF5 のデータセットの作成方法について、
Python によるサンプルコードとともにまとめました。
【HDF5 Python】HDF5 とは?HDF形式や、HDF5 をPython から使うための方法などを、サクッと、わかりやすくまとめました【データセット(dataset)作成】
HDF5をPythonから使うには、h5py ライブラリを使う方法があります。
そこでまず、h5py ライブラリをインポートします。
加えて、NumPyも使うので、一緒にインポートしておくと後で便利です。
(0), プログラミングの準備・環境の用意
本記事では、HDF5 をPythonで使うため、
「Anaconda(アナコンダ)」の「Jupiter notebook」 を起動しています。
Anaconda? Jupyter notebookってなに?というあなたや、
- 同じ環境でやりたい
といったあなたは、まず環境構築をされてください。
環境構築のやり方は以下の記事にまとめています↓
『【Python 環境構築】「Anaconda(アナコンダ)」のダウンロードとインストール方法はこちらです(mac編)【anaconda python】』
『【Python 環境構築】Pythonの「ダウンロード(download)」の、わかりやすい、やり方はこちらです(mac編)【Python入門・ 初心者】』
(もちろんあなたのPython 環境でも同様にできるかと思います)
(1), HDF5 をPython から使えるようにする(h5pyライブラリのインポート)
(2), HDF5 ファイルを作成する
HDF5 ファイルを作成するには、
h5pyのFileメソッドを使います。
作成したいファイルの名前を( ) の中に書きます。
In [4] のように、ファイルはこれから使うので、
「ファイルオブジェクト(ここでは f にしています)」に代入しておきます。
HDF5 のファイル名を決めたら、
次に、HDF5のデータセットの作成してみます。
作成方法の1つ目は、NumPy アレイのデータを代入する方法です。
(3), HDF5にデータセット作成方法①: NumPyアレイデータを使う
(3-1), NumPyアレイデータを代入
In[5] では、NumPy のゼロ行列を生成するメソッド「np.ones( )」を使っています。
3行2列のゼロ行列が生成されています。
ゼロ行列の生成ってどうするの?って方は、こちらの記事をどうぞ↓
In [6] では、生成したNumPy アレイのデータを、
「 First_Dataset 」という名前のデータセットに代入しています(名前はなんでもいいです)。
(3-2), HDF5のデータセット・データタイプ・形状を確認する
In[7] では、データセットの中身を表示しています。
Out[7] のように、
HDF5 のデータセットで、名前が「First_Datase」、形状が3行2列、データ型が f8(floatの8バイト)であることが示されています。
(ちなみに、<f8 の ”<” は、リトルエンディアンであることを表しています。>f8 ならビッグエンディアンを示します。
「エンディアン」とは、「配置の仕方」の意味で、データをメモリにどう配置するかの意味になります。
「リトルエンディアン」とは、
メモリアドレスが低いところにデータの最下位バイトのデータが入れられ、
より上位バイトのデータは、順次、メモリアドレスの高い方向に順々に格納されていく配置方式になります。
「ビッグエンディアン」の場合は、その逆になります。
すなわち、メモリアドレスの低いところに、データの最上位バイトが入れられ、
順次、メモリアドレスの高い方向に、順に、より低位バイトのデータが格納されていきます。
)
In[8] では、データセットのデータタイプを表示しています。
Out[8] のように、データ型が f8(floatの8バイト)であることが示されています。
In[9] では、データセットの形状を表示しています。
Out[9] のように、データの形状が3行2列であることが示されています。
dtype や shapeメソッドなど、NumPy の感覚をつかんでおくと理解が進むかと思います。
NumPyのdtype や shapeメソッドってどんなの?というあなたは、こちらの記事をどうぞ↓
『【Python NumPy 独学】NumPy Array を使うときの知っておきたい基本ポイントを、サンプルコードとともに、サクッとまとめました【Python 入門】』
(3-3), HDF5のデータセットを別オブジェクトに代入して、ラクに使うことができる
HDF5 データセットは、よりシンプルな名前のオブジェクトに代入して使うと、タイピングをラクにできます。
実はそれだけでなく、以下に示すような、NumPy の感覚で扱えるようになるメリットがあります。
(3-4), HDF5のデータセットを別オブジェクトに代入して、NumPy のように使うことができる
HDF5データセットは、別オブジェクトに代入すると、NumPy アレイのような扱い方ができます。
In[16]では、データセットのデータの中身を表示しています。
In[24] のようにデータセットの中身は、numpyのndarray型になっています。
(3-5), HDF5のデータセットを別オブジェクトに代入して、NumPy スライスが使える
HDF5データセットは、別オブジェクトに代入すると、中のデータをNumPyデータのように扱えます。
例えば、In[18] のように、NumPyのスライスなどが使えます。
ちなみに、In[21]のように、
中身のデータを確認する場合には、 データセットそのものの後ろに[…]をつけても確認できます。
代入したオブジェクトを変更すると、元のデータセットも変更が反映されていることがわかります。
別オブジェクトと書いていますが、中では同じメモリ領域を参照していることに注意しましょう。
HDF5 のデータセット作成には、別の方法もあります。
HDF5ファイルオブジェクトの「create_dataset メソッド」が使えます。
(4), HDF5にデータセット作成方法②: 「create_datasetメソッド」を使う
(4-1), create_dataset(データセット名, 形状)
データセットを作成するには、
In[27]のように
create_dataset メソッドに、
- データセット名
- 形状
を指定して作成します。
create_dataset メソッドを使うと、
Out[28]のように、デフォルトでは、
- データ型は、f4 (float 4バイト(32bit))
- 中身はゼロの値で初期化
されて生成されます。
(4-2), create_dataset(データセット名, 形状, データ型)
create_dataset メソッドでは、
- データセット名
- 形状
- データ型
を指定して作成することもできます。
In[29]で整数型で生成したので、Out[30]のように、
i8 (int (整数型)の8 バイト)で、
ゼロ行列が生成されている(In[32])ことがわかります。
(4-3), create_datasetで、fillvalueで任意の値で初期化する
create_dataset メソッドでは、
- データセット名
- 形状
- データ型
- fillvalue
を指定して作成することもできます。
fillvalue を使うと、データを任意の値に初期化して生成することができます。
In[33]では、値を1に初期化しています。
In[35]では、値を32に初期化しています↓
というわけで、本記事では、
HDF5 のデータセットの作成方法について、
Python によるサンプルコードとともにまとめました。
こちらもございます↓