Translate

【scipy】pythonでmatファイル形式のデータを読み取る方法:scipy+tkinter版【python】

 こんにちは。

特に理学療法研究とかのリハビリテーション関係の研究ではMATLABを使うことが結構ありますよね。リハビリテーション領域では結構な割合でMATLABを解析ツールとして使うことが一般的です。特に大学院生であれば、たくさんのツールボックスを低価格で利用できる学生版を利用することが多いです。

しかしながら企業や病院といった民間の法人でMATLABを導入する場合には、かなりのコストがかかってしまいます。そのための代替手段としてpythonを利用するという手があります。


そうなるとMATLABを使っている病院・企業と使っていない病院・企業間でのデータ解析の互換が問題になります。特にデータを辞書型の形で保存するmatファイルという形式で解析データを管理している場合には、MATLABのない病院・企業だとそのデータにアクセスすることが難しいことが想定されます。

しかしながら、matファイルはうまいこと工夫することでpythonでも読むことができます。今回はpythonパッケージであるscipyとtkinterを併用することで、マウスでmatファイルを選択するだけでmatファイル内のデータをロードする方法・コードについて紹介していきたいと思います。

matファイルをpythonでGUIで読むコードはこんな感じ



MATLABにはuigetfileという便利なGUI機能があります。これはポップアップで出てきた画面でファイルを選択することでそのパスをゲットできるという非常に便利な機能ですが残念ながらpythonにはこれに相当するモジュールはなく、自作で関数を作成する必要があります。

以前このブログで、MATLABのuigetfileに相当する関数を作成する記事を書きましたが、今回のコードはその内容がベースになります(記事URL:https://himahimaknowledge.blogspot.com/2023/10/matlabpythonmatlabuigetfileguipython.html)。

実際のコードはこんな感じです。

#必要なパッケージのインポート
import scipy 
import tkinter, tkinter.filedialog, tkinter.messagebox
def get_data(dir_name,str_name):
    #ファイルパスの取得をGUIで行う関数
    # dir_name:対象となるディレクトリ名(dataが保存されているディレクトリ名) 
    # str_name:matファイルのstruct形式の変数名
    idir = dir_name
    root = tkinter.Tk()    
    file_path = tkinter.filedialog.askopenfilename(initialdir = idir)
    #delete root window
    root.withdraw()
    dataset = scipy.io.loadmat(file_path)[str_name]
    
    return dataset
data  = get_data('raw_data', 'Results')
data2 = data[0,0]


案外そこまでややこしい感じではない感じですね。このコードを動かすために必要な引数は二つになります。一つ目はmatファイルのあるディレクトリ名、二つ目の引数はロードしたいmatファイルの中身の変数名になります。例えばResultという変数名の中にたくさんのデータを入れる構造でmatファイルを作成していた場合には、引数には’Result’を入れる必要があります。

pythonでのmatファイルの扱いについては、過去にも記事を書いたのでそちらも参照してもらえると理解が深まると思います(https://himahimaknowledge.blogspot.com/2021/11/matpythonnumpydictionary.html)。

そして、それで出力されたdataという変数からさらに一行目、一列目を選択することでデータの中身にアクセスすることができるようになります。