Python でバイナリ MATLAB .mat ファイルを読み取ることは可能ですか?
SciPy が .mat ファイルの読み取りをサポートしていると主張しているのを見てきましたが、私はそれに失敗しました。loadmat()
SciPy バージョン 0.7.0 をインストールしましたが、メソッドが見つかりません。
インポートが必要ですimport scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
どちらもscipy.io.savemat
、scipy.io.loadmat
MATLAB 配列バージョン 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
ファイルの読み取り
import scipy.io
mat = scipy.io.loadmat(file_name)
MAT 変数の型の検査
print(type(mat))
#OUTPUT - <class 'dict'>
ディクショナリ内のキーはMATLAB 変数であり、値はそれらの変数に割り当てられたオブジェクトです。
MathWorks 自体によるPython 用の MATLAB エンジンもあります。MATLAB をお持ちの場合は、検討する価値があるかもしれません (私自身は試していませんが、MATLAB ファイルを読み取るだけでなく、より多くの機能を備えています)。ただし、それを他のユーザーに配布することが許可されているかどうかはわかりません (それらの人が MATLAB を持っている場合はおそらく問題ありません。そうでない場合は、NumPy が適切な方法でしょうか?)。
また、すべての基本を自分で行いたい場合、MathWorks はファイル形式の構造に関する詳細なドキュメントを提供します (リンクが変更された場合は、matfile_format.pdf
またはそのタイトルをグーグルで検索してください)。MAT-FILE Format
個人的に思っていたほど複雑ではありませんが、明らかに、これが最も簡単な方法ではありません。.mat
また、サポートしたいファイルの機能の数にも依存します。
いくつかの基本的なファイルを読み取ることができる「小さな」(約 700 行) Python スクリプトを作成し.mat
ました。私は Python の専門家でも初心者でもありません。このコードを作成するのに約 2 日かかりました (上記のリンクにある MathWorks のドキュメントを使用)。たくさんの新しいことを学びましたが、とても楽しかったです (ほとんどの場合)。仕事でPythonスクリプトを書いたので、残念ながら公開できません...しかし、ここでいくつかのアドバイスをすることができます:
.mat
ます。miCOMPRESSED
、miMATRIX
、mxDOUBLE
、 などmiINT32
) 。.mat
構造は、データ要素をツリー データ構造に保存するのに最適です。各ノードには 1 つのクラスとサブノードがありますデータ型が混在する pandas dataFrame にマット ファイルを読み込むには
import scipy.io as sio
mat=sio.loadmat('file.mat')# load mat-file
mdata = mat['myVar'] # variable in mat file
ndata = {n: mdata[n][0,0] for n in mdata.dtype.names}
Columns = [n for n, v in ndata.items() if v.size == 1]
d=dict((c, ndata[c][0]) for c in Columns)
df=pd.DataFrame.from_dict(d)
display(df)
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)
上記のコードを使用して、デフォルトで保存された .mat ファイルを Python で読み取ることができます。