search
LoginSignup
1

posted at

updated at

HDF5のAttribute(属性)の作成・読み取り by Python (h5py)

前置き

HDF5のAttributeを読み取りたいと思って検索したが、日本語の文献は Cや fortranによる扱いばかりを説明したものばかりだった。h5pyのドキュメントをさらっと見てもよくわからなかった(たぶん説明が書いてあったんだろうが、初心者ゆえあまり理解できない部分が多かった.....)。

stackoverflowに良い質問と回答があったので(以下リンク)、ほとんどそれの翻訳みたいなことをしよう と思って書かれたのが当記事です。

HDF5のAttributeの読み取り

手順は

  1. h5pyimport
  2. (ファイルを開くときは with がより良いらしい)
  3. GroupやDatasetに .attrs を付けることでその Attributeを辞書みたいな感じで取得できる
  4. さらに .keys() を付ければ、Attributeの名前にアクセスできる
  5. 3.によって得た Attributeに 4.で得た Attributeの名前を辞書キーのように指定すれば、Attributeの中身を配列として取り出せる。
import h5py

with h5py.File("path/to/hdf5file", 'a') as f:
    # Attributeには .attrs でアクセスできる(手順3)
    attr_exmpl = f["path/to/Group_or_Dataset"].attrs
    print("読み込んだAttributeは:", attr_exmpl)
    ### 読み込んだAttributeは: <Attributes of HDF5 object at [数字]>
    # これに辞書のようにキーを付ければ中身を取り出せる。


    # Attributeのリストは辞書と同じように .keys() で得られる(手順4)
    print( attr_exmpl.keys() )
    ### <KeysViewHDF5 ['attr0', 'attr1', 'attr2', 'attr3', 'attr4']>


    # これを用いて、それぞれのAttributeの中身のデータを表示させる(手順5)
    for k in attr_exmpl.keys():
        print( f"{k} : {attr_exmpl[k]}" )
    #(テキトーな出力例↓)
    ### attr0 : 10
    ### attr1 : [0 1 2 3 4]
    ### attr2 : [[0 1 2]
    ###          [3 4 5]]
    ### attr3 : 0.
    ### attr4 : [1. 1. 1.] 

Attributeの作成

Attributeは辞書みたいなものなので、作成するときも辞書と同様。

with h5py.File("path/to/hdf5file", 'a') as f:
    # Attributeには .attrs でアクセスできる
    attr_exmpl = f["path/to/Group_or_Dataset"].attrs

    # Attributeを追加(辞書と同じ書き方)
    attr_exmpl['new_attr'] = 5

まとめ

with h5py.File(filename, 'r') as f:
  f['dataset'].attrs['name_of_attribute']
で Attributeの中身を見ることができる。
attributeofhdf5.jpg

作成する際も上の画像と同じ形で書けばよい(辞書と同じ)。

追記(公式ドキュメントを見ればわかる話でした)

前置きでも言い訳したように、公式ドキュメントを読んでも基礎知識の不足であまり理解できず、stackoverflowから具体的な操作を学び、それをこちらに日本語化したわけですが.....

答えを知ったうえで公式ドキュメントを読み返すと、内容が理解できました。
こういうことは "初心者あるある" ではないでしょうか。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1