はじめに
HDF5(Hierarchical Data Format 5)は、構造化データを 階層的かつ効率的 に保存できるフォーマットで、
CSV のように全体をメモリに展開せず、必要な部分だけにアクセスできるのが特徴です。
この性質は便利ですが、NumPy のように「すぐ配列として扱いたい」と思ったとき、
[()]
と [:]
の使い分けは意外と見落としがちです。
この記事ではその違いを、簡単な例で動作確認しながら整理していきます。
筆者自身まだ h5py 初学者ですが、温かい目で見てもらえますと幸いです。
本記事の実装コードはGoogle Colabのこちらからもご覧いただけます。
HDF5の基本的な性質については、以下の記事が参考になりますので興味がある方はご覧ください。
HDF5ファイルの作成
まずはテスト用の HDF5 ファイルを作ります。
import h5py
import numpy as np
with h5py.File("test_data.hdf5", "w") as f:
f.create_dataset("scalar_value", data=42)
f.create_dataset("array_data", data=np.arange(10))
これで以下の2つのデータができます。
-
"scalar_value"
:単なるスカラー(整数) -
"array_data"
:NumPy の 0〜9 までの配列
[()]
と [:]
の動作確認
読み込み側のコードはこちらです。
with h5py.File("test_data.hdf5", "r") as f:
print("scalar_value[()]:", f["scalar_value"][()])
# print("scalar_value[:]:", f["scalar_value"][:]) # ←これはエラーになります!
print("array_data[()]:", f["array_data"][()])
print("array_data[:]:", f["array_data"][:])
scalar_value[()]: 42
array_data[()]: [0 1 2 3 4 5 6 7 8 9]
array_data[:]: [0 1 2 3 4 5 6 7 8 9]
[:]
はスライスとして機能し、配列のすべてや一部(例:[2:5]
)を読み込むことができます。
ただし、スカラーにはスライスが存在しないため、[:]
を使うとエラーになります。
まとめると、以下のようになります。
操作 | スカラー | 配列 | 説明 |
---|---|---|---|
[()] |
✅ | ✅ | スカラー・配列どちらでも値を一括で NumPy に展開 |
[:] |
❌ | ✅ | 配列のみOK。スカラーはスライスできずエラーに |
補足:HDF5はNumPy配列っぽく見えるけど…
h5py
の Dataset
オブジェクトは、NumPy 配列のように .shape
や .dtype
を持ちますが、
中身はまだファイルにある状態で、必要なときにアクセスして取り出す仕組みです。
たとえば [()]
などでアクセスしないと中身は見えません。
with h5py.File("test_data.hdf5", "r") as f:
print(f["scalar_value"]) # <HDF5 dataset "scalar_value": shape (), type "<i8">
print(f["array_data"]) # <HDF5 dataset "array_data": shape (10,), type "<i8">
ちなみに:np.array(...)
でも同じか?
np.array(...)
でも [()]
と同様に中身を取り出せますが、スカラーでは「配列」になります。
with h5py.File("test_data.hdf5", "r") as f:
scalar_dset = f["scalar_value"]
a = scalar_dset[()] # → NumPyのスカラー型(値そのもの)
b = np.array(scalar_dset) # → 0次元のNumPy配列(array(42))
print(a) # 42
print(b) # 42
print(type(a)) # <class 'numpy.int64'>
print(type(b)) # <class 'numpy.ndarray'>
print(np.isscalar(a)) # True
print(np.isscalar(b)) # False
処理によっては型の違いに注意が必要です。
とくに np.ndarray
として扱うかどうかで挙動が変わる場面では意識しておきたいポイントだと思います。
まとめ
[()]
はスカラーでも配列でも使える万能な書き方で、迷ったときにも安心です。
逆に [:]
は配列専用で、スカラーに使うとエラーになります。
また np.array(...)
も似たように使えますが、スカラーだと配列になってしまうので、処理によっては気をつけたほうがいいかもしれません。
まだ h5py を使いはじめたばかりですが、
こうした「見た目が似ていても中身は違う」ということに気づくのは、
やっぱり探り探りで手を動かしているときなんですよね。
同じところでつまずいた方の、ささやかな道しるべになれたらうれしいです。
参考資料