Ist es möglich, binäre MATLAB-MAT-Dateien in Python zu lesen?
Ich habe gesehen, dass SciPy angeblich das Lesen von .mat-Dateien unterstützt, aber ich bin damit nicht erfolgreich. Ich habe SciPy Version 0.7.0 installiert und kann die Methode loadmat()
nicht finden.
Ein Import ist erforderlich, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
Weder scipy.io.savemat
, Noch scipy.io.loadmat
Arbeit für MATLAB-Arrays Version 7.3. Der gute Teil ist jedoch, dass MATLAB-Dateien der Version 7.3 hdf5-Datensätze sind. Sie können also mit einer Reihe von Werkzeugen gelesen werden, einschließlich NumPy .
Für Python benötigen Sie das h5py
Erweiterung, für die HDF5 auf Ihrem System erforderlich ist.
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
Speichern Sie zuerst die .mat-Datei als:
save('test.mat', '-v7')
Verwenden Sie danach in Python die übliche Funktion loadmat
:
import scipy.io as sio
test = sio.loadmat('test.mat')
Es gibt ein Nice-Paket namens mat4py
die einfach mit installiert werden kann
pip install mat4py
Es ist einfach zu bedienen (von der Website):
Daten aus einer MAT-Datei laden
Die Funktion loadmat
lädt alle in der MAT-Datei gespeicherten Variablen in eine einfache Python Datenstruktur, wobei nur die Objekte dict
und list
von Python verwendet werden Numerische und Zellen-Arrays werden in zeilenweise geordnete verschachtelte Listen konvertiert. Arrays werden komprimiert, um Arrays mit nur einem Element zu entfernen. Die resultierende Datenstruktur besteht aus einfachen Typen, die mit [~ # ~] json [kompatibel sind. ~ # ~] Format.
Beispiel: Laden Sie eine MAT-Datei in eine Python Datenstruktur:
from mat4py import loadmat
data = loadmat('datafile.mat')
Die Variable data
ist eine dict
mit den in der MAT-Datei enthaltenen Variablen und Werten.
Speichere eine Python Datenstruktur in eine MAT-Datei
Python-Daten können mit der Funktion savemat
in eine MAT-Datei gespeichert werden. Daten müssen wie für loadmat
aufgebaut sein, dh sie sollten aus einfachen Datentypen bestehen, wie dict
, list
, str
, int
und float
.
Beispiel: Speichern Sie eine Python Datenstruktur in eine MAT-Datei:
from mat4py import savemat
savemat('datafile.mat', data)
Der Parameter data
soll ein dict
mit den Variablen sein.
Ab MATLAB 2014b kann die MATLAB-Engine für Python verwendet werden:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Lesen der Datei
import scipy.io
mat = scipy.io.loadmat(file_name)
Überprüfung des Typs der MAT-Variablen
print(type(mat))
#OUTPUT - <class 'dict'>
Die Schlüssel innerhalb des Wörterbuchs sind MATLAB-Variablen und die Werte sind zugewiesene Objekte) zu diesen Variablen.
Es gibt auch die MATLAB Engine für Python von MathWorks. Wenn Sie über MATLAB verfügen, ist dies möglicherweise eine Überlegung wert (ich habe es selbst nicht ausprobiert, aber es bietet viel mehr Funktionen als nur das Lesen von MATLAB-Dateien). Ich weiß jedoch nicht, ob es zulässig ist, es an andere Benutzer weiterzugeben (es ist wahrscheinlich kein Problem, wenn diese Personen über MATLAB verfügen. Andernfalls ist NumPy möglicherweise der richtige Weg?).
Wenn Sie alle Grundlagen selbst erledigen möchten, von MathWorks bereitgestellt (Wenn sich der Link ändert, suchen Sie bei Google nach matfile_format.pdf
Oder dessen Titel MAT-FILE Format
) auf die Struktur des Dateiformats. Es ist nicht so kompliziert, wie ich persönlich dachte, aber offensichtlich ist dies nicht der einfachste Weg. Dies hängt auch davon ab, wie viele Funktionen der .mat
- Dateien Sie unterstützen möchten.
Ich habe ein "kleines" (ca. 700 Zeilen) Python Skript geschrieben, das einige grundlegende .mat
- Dateien lesen kann. Ich bin weder ein Python Experte noch ein Anfänger und es dauerte ungefähr zwei Tage, um es zu schreiben (unter Verwendung der oben verlinkten MathWorks-Dokumentation). Ich habe viel Neues gelernt und es hat ziemlich viel Spaß gemacht (die meiste Zeit). Da ich das Skript Python bei der Arbeit geschrieben habe, kann ich es leider nicht veröffentlichen ... Aber ich kann hier einige Ratschläge geben:
.mat
, Die Sie analysieren möchten.miCOMPRESSED
, miMATRIX
, mxDOUBLE
oder miINT32
)..mat
- Dateien ist optimal zum Speichern der Datenelemente in einer Baumdatenstruktur. Jeder Knoten hat eine Klasse und Unterknoten