Lesen Sie .mat Dateien in Python
Frage
Ist es möglich, binäre MATLAB .mat Dateien in Python zu lesen?
Ich habe gesehen, dass SciPy Unterstützung .mat Dateien zum Lesen, angeblich hat, aber ich bin nicht erfolgreich mit ihm. Ich installierte SciPy Version 0.7.0, und ich kann die loadmat()
Methode nicht gefunden.
Lösung
Ein Import erforderlich ist, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
Andere Tipps
Weder scipy.io.savemat
noch scipy.io.loadmat
Arbeit für MATLAB-Arrays Version 7.3. Aber das Gute ist, dass MATLAB-Version 7.3-Dateien sind hdf5 Datensätze. So können sie mit einer Reihe von Tools gelesen werden, einschließlich NumPy .
Für Python, Sie werden die h5py
Erweiterung benötigen, die HDF5 auf Ihrem System erfordert.
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
Zuerst speichern Sie die Datei als .mat:
save('test.mat', '-v7')
Danach wird in Python, verwenden Sie die übliche loadmat
Funktion:
import scipy.io as sio
test = sio.loadmat('test.mat')
Es gibt ein schönes Paket namens mat4py
, die leicht installiert werden kann mit
pip install mat4py
Es ist einfach (von der Website) zu verwenden:
Laden von Daten aus einer MAT-Datei
Die Funktion loadmat
lädt alle Variablen in der MAT-Datei in eine einfache Python-Datenstruktur gespeichert sind, nur dict
und list
Objekte Python verwenden. Numerische und Zellenfelder umgewandelt werden verschachtelte Listen Reihenordnung. Arrays sind gepresste Arrays mit nur einem Element zu beseitigen. Die sich ergebende Datenstruktur besteht aus einfachen Typen zusammengesetzt, die mit dem JSON Format.
Beispiel: Laden eine MAT-Datei in eine Datenstruktur Python:
from mat4py import loadmat
data = loadmat('datafile.mat')
Die Variable data
ist ein dict
mit den Variablen und in der MAT-Datei enthaltenen Werte.
Speichern Sie eine Python-Datenstruktur zu einer MAT-Datei
Python-Daten können auf eine MAT-Datei gespeichert werden, mit der Funktion savemat
. Daten haben in der gleichen Art und Weise strukturiert werden wie für loadmat
, das heißt es von einfachen Datentypen zusammengesetzt sein sollte, wie dict
, list
, str
, int
und float
.
Beispiel: Speichern Sie eine Python-Datenstruktur zu einer MAT-Datei:
from mat4py import savemat
savemat('datafile.mat', data)
Der Parameter data
soll ein dict
mit den Variablen sein.
Mit MATLAB 2014b oder neuer installiert ist, die MATLAB-Engine für Python verwendet werden könnte:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Lesen Sie die Datei
import scipy.io
mat = scipy.io.loadmat(file_name)
Prüfen Sie die Art der MAT Variable
print(type(mat))
#OUTPUT - <class 'dict'>
Die Tasten in der Wörterbuch sind MATLAB Variablen und die Werte sind die Objekte dieser Variablen zugewiesen .
Es gibt auch die MATLAB-Engine für Python von MathWorks selbst. Wenn Sie MATLAB haben, könnte dies eine Überlegung wert, (ich habe es selbst nicht versucht, aber es hat viel mehr Funktionen als nur das Lesen von MATLAB-Dateien). Aber ich weiß nicht, ob es sie an andere Benutzer verteilen darf (es wahrscheinlich kein Problem ist, wenn diese Personen MATLAB haben. Ansonsten vielleicht NumPy ist der richtige Weg zu gehen?).
Auch, wenn Sie sich die Grundlagen tun wollen, MathWorks bietet (wenn die Verbindung ändert, versuchen, für matfile_format.pdf
oder seinen Titel MAT-FILE Format
googeln) eine ausführliche Dokumentation über die Struktur des Dateiformats. Es ist nicht so kompliziert, wie ich persönlich gedacht, aber offensichtlich ist dies nicht der einfachste Weg zu gehen. Es hängt auch davon ab, wie viele Merkmale der .mat
-Dateien, die Sie unterstützen möchten.
Ich habe einen „kleinen“ (ca. 700 Zeilen) Python-Skript geschrieben, das einige grundlegenden .mat
-Dateien lesen kann. Ich bin weder ein Python-Experte noch ein Anfänger und es dauerte etwa zwei Tage, es zu schreiben (die MathWorks Dokumentation oben verlinkten verwendet wird). Ich habe viele neue Sachen gelernt und es war ganz lustig (die meiste Zeit). Wie ich das Python-Skript bei der Arbeit geschrieben habe, ich fürchte, ich kann es nicht veröffentlichen können ... Aber ich kann ein paar Ratschläge geben hier:
- Lesen Sie zuerst die Dokumentation.
- Verwenden Sie einen Hex-Editor (wie HxD ) und schaut in eine Referenz
.mat
- Datei, die Sie wollen, zu analysieren. - Versuchen Sie, die Bedeutung jedes Byte, um herauszufinden, indem die Bytes in eine TXT-Datei zu speichern und jede Zeile mit Anmerkungen versehen.
- Verwenden Sie Klassen jedes Datenelement (wie
miCOMPRESSED
,miMATRIX
,mxDOUBLE
odermiINT32
) speichern
- Die
.mat
-Dateien Struktur ist optimal für die Datenelemente in einer Baumdatenstruktur Einsparung; Jeder Knoten hat eine Klasse und Unterknoten