ねるねるねるねをねらずにくうぜ

C とかC++(予定)とかpythonとかgnuplotとかmatlabとかmathematicaとか書く予定ですが、最終的にはねるねるねるねをねらずに食うことを目標にしているブログです

HDF5形式のファイル (3) pythonを使った読み込み

前回、乱数とそのスペクトル(フーリエ変換結果)をHDF5形式で保存しました。

今回は、それを読みこんで、再度プロットし直すことにしましょう。

前回の記事をみて、"random.h5"というファイルを作っている前提で話を進めていきます。

結論

今回も結論から。

import h5py
import matplotlib.pyplot as plt
input_file = "random.h5" #ここには自分の状況にあったパスを入れてください

h5file = h5py.File(input_file,"r")
fig, (ax_random, ax_spectrum) = plt.subplots(1,2,figsize = (14,5.5))

for sample_frequency in np.array([10.,100,1000.]):
    
    folder="frequency_"  + str(np.int(sample_frequency)) 
    
    #データ読み込み
    random  = h5file[folder+"/random_number"].value 
    spectrum = h5file[folder+"/spectrum"].value
    
    #plot
    ti = np.arange(0,100.,1)/sample_frequency
    ax_random.plot(ti,random,'o')
    ax_spectrum.plot(np.abs(spectrum))

こんなのができます

データの確認

ディレクトリの確認から始めます。

まずは、"random.h5"を保存したフォルダを探しましょう。 前回は、

import h5py
output_file = "random.h5"
h5file = h5py.File(output_file,'w')
for i in np.arange(3):
    dir = 'frequency_'+str(np.int(sampling_frequency[i]))
    h5file.create_group(dir)
    h5file.create_dataset(dir+'/random_number',data= sample[i])
    h5file.create_dataset(dir+'/spectrum',data= sample_fft[i])
    h5file.flush()
    
h5file.flush()
h5file.close()

こんな感じで保存したので、 ipython notebookのファイルが入っていたフォルダの中に"random.h5"ができているはずです。

ノートブックファイル(*.ipynb)とhdf5ファイルが同じフォルダに入っているなら特に気にしなくていいのですが、そうでない場合、そのディレクトリまでのパスをしっかり確認しておきましょう。

見つかったら開いてみてください。

とまぁ、

  • frequency
    • 乱数
    • スペクトル

のような階層になっていることを思い出せればいいです。

データの読み込み

ぶっちゃけデータが書き出せるなら、読み込みはむっちゃ楽勝です。

まずは読み込むHDF5ファイルを指定します.

input_file = "random.h5"
h5file = h5py.File(input_file,"r")

この操作は、read only でファイルを開く動作に対応します。

次に、読み込みたいデータの入っているグループ(フォルダ)と、読み込みたいデータ自体を指定すると、データセットが読み込めます。

 folder="frequency_"  + str(np.int(sample_frequency)) 
 random  = h5file[folder+"/random_number"].value 
 spectrum = h5file[folder+"/spectrum"].value

上の例では、"random"に"random_number"というデータ・セットを渡しています。".value"をつけるのを忘れないようにしてください。

ちなみに、データ・セットがndarrayのような多次元の場合、上の例のように書くと、自動的に全部引っ張ってきます。 もし、"n行m列のデータ・セット"のうち、”一列目だけ欲しい” 場合、

test = h5file[group_name + data_set].value[:,0]

のようにしてあげればいいです。

つまるところ、

h5file[group_name + data_set].value

と書くと、こいつはデータ・セットそのものの配列になっている、ということが理解できていれば、読み込みは問題なくできるでしょう。

プロット

プロットについては、プロットまとめを参考にしてください。