Lesen Sie .mat-Dateien in Python

383

Ist es möglich, binäre MATLAB .mat-Dateien in Python zu lesen?

Ich habe gesehen, dass SciPy angeblich Unterstützung für das Lesen von .mat-Dateien hat, aber ich bin damit nicht erfolgreich. Ich habe SciPy Version 0.7.0 installiert und kann die loadmat()Methode nicht finden .

Gilad Naor
quelle

Antworten:

517

Ein Import ist erforderlich, import scipy.io...

import scipy.io
mat = scipy.io.loadmat('file.mat')
Gilad Naor
quelle
6
Offizielles SciPy.io-Tutorial: docs.scipy.org/doc/scipy/reference/tutorial/io.html
Franck Dernoncourt
18
scipy unterstützt keine v7.3-Mat-Dateien (siehe Hinweise hier ). Siehe die Antwort von vikrantt für eine Lösung.
Texnic
Sie können Mat-Dateien jedoch als frühere Versionen speichern. Siehe: mathworks.com/help/matlab/import_export/mat-file-versions.html (Header: 'In nicht standardmäßiger MAT-Dateiversion
speichern
5
zBsave('myfile.mat','-v7')
Watsonic
149

Weder scipy.io.savematnoch scipy.io.loadmatfür MATLAB-Arrays Version 7.3. Das Gute daran ist jedoch, dass MATLAB-Dateien der Version 7.3 HDF5-Datensätze sind. Sie können also mit einer Reihe von Tools gelesen werden, darunter NumPy .

Für Python benötigen Sie die h5pyErweiterung, 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
vikrantt
quelle
6
Dies funktioniert einwandfrei, wenn Sie beim Speichern Ihrer Daten das Flag '-v7.3' in Matlab verwenden. Die Verwendung der Standardeinstellung save(zumindest in Matlab R2014b) führt zu einer Datei, die mit der oben beschriebenen Technik nicht gelesen werden kann. Wenn Sie das Flag '-v7.3' verwenden, können die numerischen Daten einwandfrei gelesen werden.
Chipaudette
3
Ja, das habe ich in meinem Beitrag gesagt. Sie müssen -v7.3 beim Speichern in Matlab verwenden. Sie sollten dies trotzdem tun, da es ein besseres / besser unterstütztes / standardisiertes Format verwendet.
Vikrantt
4
Könnten Sie bitte erklären, wie die Beziehung zwischen f und Daten in Ihrem Beispiel ist? Wie kann ich f in ein numpy Array verschieben?
Heracho
Speichern Sie eine Variable mit diesem Befehl von der Eingabeaufforderung:save('filename', '-v7.3', 'var1');
Kevin Katzke
23

Speichern Sie zuerst die .mat-Datei als:

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

Verwenden Sie danach in Python die übliche loadmatFunktion:

import scipy.io as sio
test = sio.loadmat('test.mat')
Bhanu Pratap Singh
quelle
15

Es gibt ein schönes Paket namens, mat4pydas einfach mit installiert werden kann

pip install mat4py

Es ist einfach zu bedienen (von der Website):

Laden Sie Daten aus einer MAT-Datei

Die Funktion loadmatlädt alle in der MAT-Datei gespeicherten Variablen in eine einfache Python-Datenstruktur und verwendet nur Pythons dictund listObjekte. Numerische und Zellen-Arrays werden in verschachtelte Listen mit Zeilenreihenfolge konvertiert. Arrays werden zusammengedrückt, 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 dataist a dictmit den in der MAT-Datei enthaltenen Variablen und Werten.

Speichern Sie eine Python-Datenstruktur in einer MAT-Datei

Python-Daten können mit der Funktion in einer MAT-Datei gespeichert werden savemat. Daten haben in der gleichen Art und Weise strukturiert werden wie loadmat, dh es einfache Datentypen zusammengesetzt sein sollte, wie dict, list, str, int, und float.

Beispiel: Speichern Sie eine Python-Datenstruktur in einer MAT-Datei:

from mat4py import savemat

savemat('datafile.mat', data)

Der Parameter datamuss a dictmit den Variablen sein.

Cleb
quelle
Beachten Sie, dass mat4py Ihnen einen json-ähnlichen Baum von Diktaten, Listen, Listen von Listen ... gibt - überhaupt keine Anzahl. ( mat4py/cmd.py my.matschreibt my.json, 1 lange Zeile.)
Denis
1
@denis: Ja, das ist auch oben angegeben. Aber ein guter Punkt: Ich mag diese Struktur normalerweise, z. B. in Webanwendungen, da Numpy-Arrays nicht JSON-serialisierbar sind .
Cleb
Begegnung:mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
s2t2
@ s2t2: bin noch nie auf dieses Problem gestoßen. Welche Matlab-Version und welche Scipy-Version verwenden Sie?
Cleb
ParseError: Unerwartete Feldnamenlänge: 43
Aleksejs Fomins
13

Wenn MATLAB 2014b oder höher installiert ist, kann die MATLAB-Engine für Python verwendet werden:

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Daniel
quelle
Ich habe diesen Fehler erhalten: ModuleNotFoundError: Kein Modul mit dem Namen 'pylab'.
Regen
3
Sie haben den Fehler beim Ausprobieren dieser Antworten erhalten? Das ist seltsam, es wird kein Pylab verwendet.
Daniel
11

Datei lesen

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

Überprüfen des Typs der MAT-Variablen

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

Die Schlüssel im Wörterbuch sind MATLAB-Variablen , und die Werte sind die Objekte, die diesen Variablen zugewiesen sind .

Daksh
quelle
7

Es gibt auch die MATLAB Engine für Python von MathWorks. Wenn Sie MATLAB haben, ist dies möglicherweise eine Überlegung wert (ich habe es nicht selbst ausprobiert, aber es bietet viel mehr Funktionen als nur das Lesen von MATLAB-Dateien). Ich weiß jedoch nicht, ob es erlaubt ist, es an andere Benutzer zu verteilen (es ist wahrscheinlich kein Problem, wenn diese Personen MATLAB haben. Andernfalls ist NumPy vielleicht der richtige Weg?).

Wenn Sie alle Grundlagen selbst erledigen möchten, bietet MathWorks (wenn sich der Link ändert, versuchen Sie, nach Google matfile_format.pdfoder seinem Titel zu suchen MAT-FILE Format) eine detaillierte Dokumentation zur Struktur des Dateiformats. Es ist nicht so kompliziert, wie ich persönlich dachte, aber offensichtlich ist dies nicht der einfachste Weg. Es hängt auch davon ab, wie viele Funktionen der.matDies Dateien Sie unterstützen möchten.

Ich habe ein "kleines" Python-Skript (ca. 700 Zeilen) geschrieben, das einige grundlegende .matDateien lesen kann. Ich bin weder ein Python-Experte noch ein Anfänger, und ich habe ungefähr zwei Tage gebraucht, um es zu schreiben (unter Verwendung der oben verlinkten MathWorks-Dokumentation). Ich habe viele neue Sachen gelernt und es hat ziemlich viel Spaß gemacht (die meiste Zeit). Da ich das Python-Skript bei der Arbeit geschrieben habe, kann ich es leider nicht veröffentlichen ... Aber ich kann hier einige Ratschläge geben:

  • Lesen Sie zuerst die Dokumentation.
  • Verwenden Sie einen Hex-Editor (z. B. HxD ) und suchen Sie in einer Referenzdatei, .matdie Sie analysieren möchten.
  • Versuchen Sie, die Bedeutung jedes Bytes herauszufinden, indem Sie die Bytes in einer TXT-Datei speichern und jede Zeile mit Anmerkungen versehen.
  • Nutzungsklassen zu jedem Datenelement speichern (wie miCOMPRESSED, miMATRIX, mxDOUBLE, oder miINT32)
  • Die .matStruktur der -files ist optimal zum Speichern der Datenelemente in einer Baumdatenstruktur. Jeder Knoten hat eine Klasse und Unterknoten
Mozzbozz
quelle
9
Das ist eine irgendwie verrückte Dokumentation von Mathworks. 40 Seiten, die das Format erklären, ohne zu erwähnen, dass es sich um eine Teilmenge von HDF5 handelt.
Daniel
-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)

Sie können den obigen Code verwenden, um die standardmäßig gespeicherte .mat-Datei in Python zu lesen.

Sameer Gadekar
quelle