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を使う方が無難なようです).
参考リンク