Pythonで.matファイルを読み取る


383

PythonでバイナリのMATLAB .matファイルを読み取ることはできますか?

SciPyが.matファイルの読み取りをサポートしていると主張しているのを見てきましたが、それはうまくいきませんでした。SciPyバージョン0.7.0をインストールしましたが、loadmat()メソッドが見つかりません。

回答:


517

インポートが必要ですimport scipy.io...

import scipy.io
mat = scipy.io.loadmat('file.mat')


18
scipyはv7.3 mat-filesをサポートしていません(ここの注を参照)。解決策については、vikranttによる回答を参照してください。
texnic 2014年

ただし、マットファイルを以前のバージョンとして保存できます。参照:mathworks.com/help/matlab/import_export/mat-file-versions.html(ヘッダー: 'Save to Nondefault MAT-File Version')
watsonic

5
save('myfile.mat','-v7')
ワトソニック2015

149

scipy.io.savematscipy.io.loadmatMATLABアレイバージョン7.3 でも機能しません。しかし、良い点は、MATLABバージョン7.3ファイルがhdf5データセットであることです。そのため、NumPyなどのいくつかのツールを使用して読み取ることができます。

Pythonの場合h5py、システムにHDF5 が必要な拡張機能が必要です。

import numpy as np
import h5py
f = h5py.File('somefile.mat','r')
data = f.get('data/variable1')
data = np.array(data) # For converting to a NumPy array

6
データを保存するときにMatlabで「-v7.3」フラグを使用すると、これは正常に機能します。デフォルトsave(少なくともMatlab R2014bでは)を使用すると、上記の手法を使用して読み取ることができないファイルになります。'-v7.3'フラグを使用すると、数値データを問題なく読み取ることができます。
チポデット2015年

3
はい、それは私の投稿で私が言ったことです。Matlabで保存するときは-v7.3を使用する必要があります。それはより良い/よりサポートされた/標準化されたフォーマットを使用するので、とにかくそれを行うべきです。
vikrantt 2015年

4
あなたの例でfdataの関係は何ですか?どうすればfをnumpy配列に移動できますか?
ヘラチョ2017

プロンプトから次のコマンドで変数を保存:save('filename', '-v7.3', 'var1');
ケビンKatzke

23

最初に.matファイルを次のように保存します。

save('test.mat', '-v7')

その後、Pythonで通常のloadmat関数を使用します。

import scipy.io as sio
test = sio.loadmat('test.mat')

15

mat4pyを使用して簡単にインストールできるという素敵なパッケージがあります

pip install mat4py

(ウェブサイトから)使用するのは簡単です:

MATファイルからデータを読み込む

この関数loadmatは、MATファイルdictlistオブジェクトのみを使用して、MATファイルに格納されているすべての変数を単純なPythonデータ構造にロードします。数値配列とセル配列は、行順にネストされたリストに変換されます。配列は、要素が1つしかない配列を削除するために圧縮されます。結果のデータ構造は、互換性のある単純な型で構成されます JSON形式ます。

例:MATファイルをPythonデータ構造にロードします。

from mat4py import loadmat

data = loadmat('datafile.mat')

変数datadict、MATファイルに含まれている変数と値を含むa です。

Pythonデータ構造をMATファイルに保存する

関数を使用して、PythonデータをMATファイルに保存できますsavemat。データはと同じように構造化する必要があるloadmatように、それは、単純なデータ型で構成されなければならない、すなわちdictliststrint、およびfloat

例:Pythonデータ構造をMATファイルに保存します。

from mat4py import savemat

savemat('datafile.mat', data)

パラメータdatadict、変数を持つものでなければなりません。


mat4pyは、ディクショナリ、リスト、リストのリストのjsonのようなツリーを提供することに注意してください-まったくnumpyはありません。(mat4py/cmd.py my.mat書き込みmy.json、1つの長い行。)
denis

1
@denis:はい、それも上記のとおりです。しかし、確かに良い点です。たとえば、numpy配列はJSONシリアル化可能ではないため、私は通常、たとえばWebアプリケーションでこの構造を好みます
Cleb

遭遇した:mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
s2t2

@ s2t2:これまでこの問題に遭遇したことはありません。どのMATLABバージョンとどのScipyバージョンを使用していますか?
Cleb

ParseError:予期しないフィールド名の長さ:43
Aleksejs Fomins

13

MATLAB 2014b以降がインストールされている場合、Python用MATLABエンジンを使用できます。

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)

このエラーが発生しました:ModuleNotFoundError: 'pylab'という名前のモジュールはありません。

3
この答えを試すときにエラーが発生しましたか?奇妙なことに、pylabを使用しません。
ダニエル

11

ファイルを読み取る

import scipy.io
mat = scipy.io.loadmat(file_name)

MAT変数の型の検査

print(type(mat))
#OUTPUT - <class 'dict'>

辞書内のキーMATLAB変数であり、値はそれらの変数に割り当てられオブジェクトです


7

Python用MATLABエンジンもあります。MathWorks自体によるます。MATLABをお持ちの場合、これは検討に値するかもしれません(私は自分で試したことはありませんが、MATLABファイルを読み取るだけよりも多くの機能を備えています)。ただし、他のユーザーへの配布が許可されているかどうかはわかりません(それらのユーザーがMATLABを持っている場合はおそらく問題ありません。それ以外の場合は、NumPyが正しい方法でしょうか?)。

また、すべての基本を自分で実行したい場合は、MathWorksがファイル形式の構造に関する詳細なドキュメントを提供します(リンクが変更された場合は、Google matfile_format.pdfまたはそのタイトルを探してくださいMAT-FILE Format)。個人的に思ったほど複雑ではありませんが、これが最も簡単な方法ではありません。それはまた、.mat、サポートファイルのます。

いくつかの基本的な.matファイルを読み取ることができる「小さな」(約700行)Pythonスクリプトを作成しました。私はPythonの専門家でも初心者でもないため、それを書くのに約2日かかりました(上記のリンクにあるMathWorksのドキュメントを使用)。私は多くの新しいことを学びました、そしてそれは(ほとんどの場合)とても楽しかったです。仕事でPythonスクリプトを作成したので、公開できないと思いますが、ここでアドバイスを提供できます。

  • 最初にドキュメントを読みます。
  • 16進エディター(HxDなど)を使用して、.mat解析する参照ファイルを調べます。
  • バイトを.txtファイルに保存して各バイトの意味を理解し、各行に注釈を付けてください。
  • (のような各データ要素を保存するためのクラスを使用してmiCOMPRESSEDmiMATRIXmxDOUBLE、またはmiINT32
  • .mat-files'構造は、ツリーデータ構造のデータ要素を保存するために最適です。各ノードには1つのクラスとサブノードがあります

9
これは、mathworksが提供するなんとなくクレイジーなドキュメントです。HDF5のサブセットであることは言うまでもなく、フォーマットを説明する40ページ。
ダニエル

-1
from os.path import dirname, join as pjoin
import scipy.io as sio
data_dir = pjoin(dirname(sio.__file__), 'matlab', 'tests', 'data')
mat_fname = pjoin(data_dir, 'testdouble_7.4_GLNX86.mat')
mat_contents = sio.loadmat(mat_fname)

上記のコードを使用して、Pythonで保存されたデフォルトの.matファイルを読み取ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.