リンク > ITメモ > Python h5py & MATLAB

h5pyモジュールでMATLABファイル(.mat)を読み込む

はじめに

そもそもh5pyとは

 HDF5 for Pythonの略称.HDF(Hierarchical Data Format)データをPythonで扱うためのモジュール

MATLAB使えば良いのでは?

 私自身も含め,周りでMATLABを使っている人はいませんでした.ましてHDF5というフォーマットにも疎く,Pythonで何とか解読する以外の道がなかったため,このモジュールに辿り着きました.

参照スクリプト

 ある地点での時系列の観測河川流量データと,その地点での緯度経度情報が格納されたMATLABファイル(DISCHARGE.mat)があるとします.ここからそれらの情報を抽出するためには以下のように書きます. 注意点は,groupやmember,datasetなどのデータの構造を逐次確認しつつ,必要なデータにアクセスする必要があるという点です.
import numpy as np
import h5py
from os.path import join

def make_dict(var_values, lat, lon):
    dict_data = {var: var_values, 'lat': lat, 'lon': lon}
    print dict_data

def get_coordinates(f):
    lat = f.get('/{}/StationCoords/Lat'.format(var))[0][0]
    lon = f.get('/{}/StationCoords/Lon'.format(var))[0][0]
    print '\nLat: ', lat
    print '\nLon: ', lon
    return lat, lon

def get_values(f):
    var_values = f.get('/{}/{}'.format(var, var.capitalize()))[0]
    print '\n{}: '.format(var), var_values
    print '\nRiver: ', f.get('{}/River'.format(var))[0][0]
    print '\nStation: ', f.get('{}/Station'.format(var))[0][0]
    return var_values

def display_matfile_info(f):
    print '\nKeys: \n', f.keys() # check keys
    print '\nItems: \n', f.items() # check items
    print '\nDatasets in {}: \n'.format(var), f[var] # check all datasets in the var group
    # Now we have to look into the /var to see what the 4 members are.
    print '\nOverview of all members: \n', f.get('/{}'.format(var)).values()

def main():
    # open the matlab file
    f = h5py.File(fn_in, 'r')
    # display information contained in the matlab file
    display_matfile_info(f)
    # get values for the variable
    var_values = get_values(f)
    # get coordinates
    lat, lon = get_coordinates(f)
    # make dictionary
    make_dict(var_values, lat, lon)

if __name__=='__main__':
    # I/O
    dir_in = './'
    loc_id = './'
    var = 'DISCHARGE'
    fn_in = join(dir_in, loc_id, '{}.mat'.format(var))
    dir_out = './'
    fn_out = join(dir_out, '{}.csv'.format(var))
    # main
    main()

おわりに

 下記に挙げた開発チームのGitHubページを見てみると,Issuesが143個(2018年12月11日時点)もあることに気付きます…あまり得体の知れない(と言っては失礼ですが)モジュールを使うのは怖いですね(どうやらscipy.ioを使う方が無難なようです).

参考リンク