ソフトな忘却力(89) SciPy と Scilabの間でMatlab形式の入出力のお勉強

Joseph Halfmoon

「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lecturesの実習中。前回はMatplotlibのお勉強でしたが、これからも機会あり、サッサと先に進めることにいたしました。お次はSciPyとな。Pythonにおける科学技術計算を支えているものらしいです。

※「 ソフトな忘却力」投稿順 Index はこちら

Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それを全部順番に解いていったら必ずや立派な人になれるだろ~とは思います。でも量が多過ぎて死ぬまでに終わらない老い先短い年寄デス。今回は「Chapter 5 SciPy : high-level scientific computing」に入ります。

Scipy.io

レクチャーの進行にあわせ、今回は「5.1 File input/output: scipy.io」を練習したいと思います。レクチャではScipy.ioを使ってMatlab形式の「バイナリ・ファイル」へのセーブとロードを練習しているのです。しかし、お相手のMatlabは登場しません。まあ、「業界標準」なMAT形式への入出力が出来るをことを示せば、後はMatlabでもOctaveでもお好みのまま、ということなんでありましょう。

しかしお惚け老人は、別件シリーズで、Matlabに似ているけど「ちょっと違う」Scilabを使わせていただくことが多いデス。実際にPython+SciPyとScilabとの間でデータ交換できることを確認しないと、安心できませぬ。

なお、以下のシリーズ過去回でCSV(テキスト)形式に落としたR言語のサンプルデータベースをPython+Numpyで読み込んでいます。

ソフトな忘却力(83) みんな大好きNumPy配列へのデータ読み込みのお勉強

テキスト(CSV)形式は上記でできそうなので、今回は「バイナリ」で配列そのものを読み書きしてみる練習っす。

ScipyからMATファイルの書き出し

以下のようにScipyからMAT形式バイナリへの書き出しに使うのは、scipy.io.savemat()関数です。MatlabのMAT形式のバイナリファイルには、変数名をキーにして、データとして配列を与えた形の辞書(連想配列)がセーブできるので、一番下のような表現になってます。saveB33
つーことは、上記では1個だけですけど、複数個のデータ配列を1個のバイナリファイルの中に押し込めて輸出することも可能だと。

ScilabでのMATファイルの読み込み

「そこそこMatlabと互換性がある」Scilabなので、MAT形式のバイナリの読み込み関数などは用意されております。以下です。なお使用したScilabのバージョンは2024.0.0です。

loadmatfile()

ただ、MAT形式にもバージョンがあるみたいで、Scilabのドキュメント読むと、loadmatfile()で読めるのはV6だとか、書き出しのときはV7オプションとか、いろいろバージョンがチラチラしてます。また、SciPy出力の方はファイルの中にV5?と書いてあるんだが。結構、考えこんでしまいました。見る前に飛べ、案ずるより産むがやすし、以下のようにloadmatfile()一発で読めてしまいました。大丈夫か?ScilabLoad
なお、loadmattfile()関数は戻り値に [] を返してくるので、アレっという感じがしますが、便りが無いのは無事な証拠で、ファイルの中に連想配列として列挙されている変数どもは、キーを変数名、バリューをデータとしてScilabの記憶域に展開されております。中身をみるとSciPy上で定義した整数配列がちゃんと同じ形で見えてます。戻り値として変数に代入して使いたい場合はオプションが必要みたい。

ScilabでのMATファイルの書き出し

そのままのデータを戻しても芸がないので、整数配列を倍精度の浮動小数に変換した上で、各要素を1.1倍した配列 f33 をMATファイルにして戻したいと思います。操作はこんな感じ。ScilabSave
書き出しに使うのはsavematfile()関数です。書き出しファイル名につづいて、書き出す変数名を列挙すれば、列挙された変数どもが「辞書(連想配列)」化されてバイナリファイルに書きこまれるみたいです。今回は1個だけね。

SciPyでのMATファイルの読み込み

さて、待ち受けるSciPy側で、MATファイルを読み込むのは scipy.io.loadmat()関数です。これで読み込むとPythonの辞書(連想配列)として読み込めます。loadf33

変数名をキーとした辞書なので、変数名でアクセスすれば上記のようにScilab側で加工した配列が読み取れていることが分かります。

なお、「レクチャ」の注意点によれば、1次元のNumpy配列をMAT形式出力しても、入力すると2次元の配列の最初の1行に元の配列が入っているような形式になってしまうようです。コマケー話?なんだが。

ソフトな忘却力(88) お楽しみだけど覚えられないMatplotlibのカラーマップのお勉強 へ戻る

ソフトな忘却力(90) SciPy.special の関数からガンマ関数のお勉強 へ進む

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です