2009-05-17 22 views
234

Hat jemand Erfahrung mit dem Lesen binärer Matlat-.mat-Dateien in Python?.mat-Dateien in Python lesen

(ich habe gesehen, dass scipy Unterstützung für das Lesen von Dateien .mat angeblich hat, aber ich bin nicht erfolgreich mit ihm. Ich installierte scipy Version 0.7.0, und ich kann die loadmat() Methode nicht gefunden)

Antwort

339

Wie dumm von mir. Vergessen io zu importieren ...

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

Offizielle SciPy.io Lernprogramm: http://docs.scipy.org/doc/scipy/reference/tutorial/io.html –

+13

scipy unterstützt nicht v7.3 Mat-Dateien (siehe Hinweise [hier] (http : //docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.io.loadmat.html)). Siehe die [Antwort von Vikrant] (http://StackOverflow.com/a/19340117/674976) zur Lösung. – texnic

+0

jedoch können Sie Mat-Dateien als frühere Versionen speichern. siehe: http://www.mathworks.com/help/matlab/import_export/mat-file-versions.html (Überschrift: 'In nicht standardmäßige MAT-File Version speichern') – watsonic

92

Weder scipy.io.savemat noch scipy.io.loadmat Arbeit für Matlab-Arrays --v7.3. Aber der gute Teil ist, dass Matlab - v7.3 Dateien sind hdf5 Datensätze. So können sie mit einer Reihe von Tools gelesen werden, einschließlich numpy.

Für Python benötigen Sie die Erweiterung h5py, 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 numpy array 
+3

Das funktioniert gut, wenn Sie beim Speichern Ihrer Daten das Flag '-v7.3' in Matlab verwenden. Die Verwendung des Standard 'save' (zumindest in Matlab R2014b) führt zu einer Datei, die nicht mit der obigen Technik gelesen werden kann. Wenn Sie das Flag '-v7.3' verwenden, können die numerischen Daten problemlos gelesen werden. – chipaudette

+2

Ja, das habe ich in meinem Beitrag gesagt. Sie müssen -v7.3 beim Speichern in Matlab verwenden. Sie sollten das trotzdem tun, da es ein besseres/mehr unterstütztes/standardisiertes Format verwendet. – vikrantt

+2

Könnten Sie bitte erläutern, was die Beziehung zwischen _f_ und _data_ in Ihrem Beispiel ist? Wie kann ich _f_ in ein numpliges Array verschieben? – heracho

4

Es gibt auch die MATLAB Engine for Python von MathWorks selbst. Wenn Sie Matlab haben, könnte dies in Betracht gezogen werden (Ich habe es selbst nicht versucht, aber es hat viel mehr Funktionen als nur Matlab-Dateien zu lesen). Allerdings weiß ich nicht, ob es erlaubt ist, es an andere Benutzer zu verteilen (wahrscheinlich kein Problem, wenn diese Personen Matlab haben, sonst ist vielleicht NumPy der richtige Weg?).

Auch, wenn Sie sich die Grundlagen tun wollen, MathWorks provides (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 dachte, aber offensichtlich ist das nicht der einfachste Weg. Es hängt auch davon ab, wie viele Funktionen der .mat-Dateien, die Sie unterstützen möchten.

Ich habe ein "kleines" (etwa 700 Zeilen) Python-Skript geschrieben, das einige grundlegende .mat-Dateien 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 eine Menge neuer Sachen gelernt und es war ziemlich lustig (die meiste Zeit). Wie ich den Python-Skript bei der Arbeit geschrieben habe, habe ich Angst, dass ich es nicht veröffentlichen kann ... Aber ich kann hier ein paar Ratschläge geben:

  • zuerst die Dokumentation
  • Sie mit einem HEX-Editor lesen (die Bedeutung jeden Byte, um herauszufinden, indem das Bytes in eine txt-Datei zu speichern und mit Anmerkungen versehen jeder Zeile
  • Nutzungsklassen wie HxD) und schaut in eine Referenz .mat -datei Sie
  • Versuchen analysieren wollen um alle Daten zu speichern Element (wie miCOMPRESSED, miMATRIX, mxDOUBLE oder miINT32)
  • Die Struktur .mat -files ist optimal zum Speichern der Datenelemente in einer Baumstruktur; jeder Knoten eine Klasse und Unterknoten hat
+7

Das ist eine irgendwie verrückte Dokumentation von mathworks. 40 Seiten erklären das Format, ohne zu erwähnen, dass es sich um eine Untergruppe von HDF5 handelt. – Daniel

+0

ist Ihr Code auf Github überall? – ErroriSalvo

+1

@ErroriSalvo Nein, tut mir leid. Ich habe das bei der Arbeit gemacht, nicht in meiner Freizeit, also kann ich den Code nicht teilen. Auch nie wirklich poliert, war mehr ein Proof-of-Concept. – mozzbozz

6

Mit Matlab 2014b oder neuer installiert ist, könnte die Matlab engine for Python verwendet werden:

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

Ich habe eine halbe Stunde geschraubt, auch nach dem Lesen der Antworten. Hoffen, dass diese Antwort

Zuerst speichern Sie die Matte Datei als

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

Danach in Python verwenden, um die üblichen loadmat

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

Lesen der Datei

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

Insecting hilft die Art der Matte varia ble

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

Die Tasten innerhalb des Wörterbuch sind Matlab Variablen und die Werte werden die Objekte zu diesen Variablen zugewiesen.