Leggi i file .mat in Python


383

È possibile leggere i file binari MATLAB .mat in Python?

Ho visto che SciPy ha sostenuto il supporto per la lettura di file .mat, ma non ci riesco. Ho installato SciPy versione 0.7.0 e non riesco a trovare il loadmat()metodo.

Risposte:


517

È richiesta un'importazione, import scipy.io...

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


18
scipy non supporta file mat v7.3 (vedere le note qui ). Vedi la risposta di vikrantt per la soluzione.
texnic,

tuttavia, è possibile salvare file mat come versioni precedenti. vedi: mathworks.com/help/matlab/import_export/mat-file-versions.html (header: 'Save to Nondefault MAT-File Version')
watsonic

5
es.save('myfile.mat','-v7')
watsonic,

150

Né funziona scipy.io.savematscipy.io.loadmatper gli array MATLAB versione 7.3. Ma la parte buona è che i file MATLAB versione 7.3 sono set di dati hdf5. Quindi possono essere letti utilizzando una serie di strumenti, tra cui NumPy .

Per Python, avrai bisogno h5pydell'estensione, che richiede HDF5 sul tuo sistema.

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

6
Funziona bene se usi il flag '-v7.3' in Matlab quando salvi i tuoi dati. L'uso del valore predefinito save(almeno in Matlab R2014b) genera un file che non può essere letto usando la tecnica sopra. Se usi il flag '-v7.3', i dati numerici possono essere letti bene.
chipaudette,

3
Sì, è quello che ho detto nel mio post. È necessario utilizzare -v7.3 durante il salvataggio in Matlab. Dovresti farlo comunque poiché utilizza un formato migliore / più supportato / standardizzato.
vikrantt,

4
Potresti spiegare qual è la relazione tra f e i dati nel tuo esempio? Come posso spostare f in una matrice numpy?
Heracho,

Salvare una variabile con questo comando dal prompt:save('filename', '-v7.3', 'var1');
Kevin Katzke

23

Prima salva il file .mat come:

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

Dopodiché, in Python, usa la solita loadmatfunzione:

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

15

C'è un bel pacchetto chiamato mat4pyche può essere facilmente installato usando

pip install mat4py

È semplice da usare (dal sito Web):

Carica dati da un file MAT

La funzione loadmatcarica tutte le variabili memorizzate nel file MAT in una semplice struttura di dati Python, usando solo Python dicte listoggetti. Le matrici numeriche e cellulari vengono convertite in elenchi nidificati ordinati per riga. Le matrici vengono compresse per eliminare le matrici con un solo elemento. La struttura dei dati risultante è composta da tipi semplici compatibili con JSON formato .

Esempio: caricamento di un file MAT in una struttura di dati Python:

from mat4py import loadmat

data = loadmat('datafile.mat')

La variabile dataè a dictcon le variabili e i valori contenuti nel file MAT.

Salvare una struttura di dati Python in un file MAT

I dati Python possono essere salvati in un file MAT, con la funzione savemat. I dati deve essere strutturato nello stesso modo che per loadmat, vale a dire che dovrebbe essere composto di tipi di dati semplici, come dict, list, str, int, e float.

Esempio: salvataggio di una struttura di dati Python in un file MAT:

from mat4py import savemat

savemat('datafile.mat', data)

Il parametro datadeve essere a dictcon le variabili.


Nota che mat4py ti dà un albero di dicts, elenchi, elenchi di liste simili a json ... - nessun intorpidimento. ( mat4py/cmd.py my.matscrive my.json, 1 linea lunga.)
denis

1
@denis: Sì, è stato detto anche sopra. Ma un buon punto in effetti: di solito mi piace questa struttura, ad esempio nelle applicazioni Web poiché gli array intorpiditi non sono serializzabili JSON .
Cleb,

Incontro:mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
s2t2

@ s2t2: non ho mai incontrato questo problema prima. Quale versione di Matlab e quale versione di Scipy stai usando?
Cleb

ParseError: Lunghezza del campo inaspettata: 43
Aleksejs Fomins,

13

Con MATLAB 2014b o più recente installato, è possibile utilizzare il motore MATLAB per Python :

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

Ho ricevuto questo errore: ModuleNotFoundError: nessun modulo chiamato 'pylab'.
Piove il

3
Hai ricevuto l'errore quando provi questa risposta? È strano, non usa pylab.
Daniel,

11

Lettura del file

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

Ispezione del tipo di variabile MAT

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

Le chiavi all'interno del dizionario sono variabili MATLAB e i valori sono gli oggetti assegnati a tali variabili .


7

Esiste anche il motore MATLAB per Python dello stesso MathWorks. Se hai MATLAB, questo potrebbe valere la pena considerarlo (non l'ho provato da solo ma ha molte più funzionalità rispetto alla semplice lettura dei file MATLAB). Tuttavia, non so se è consentito distribuirlo ad altri utenti (probabilmente non è un problema se quelle persone hanno MATLAB. Altrimenti, forse NumPy è la strada giusta da percorrere?).

Inoltre, se si desidera eseguire autonomamente tutte le nozioni di base, MathWorks fornisce (se il collegamento cambia, provare a utilizzare Google matfile_format.pdfo il suo titolo MAT-FILE Format) una documentazione dettagliata sulla struttura del formato del file. Non è complicato come pensavo personalmente, ma ovviamente non è il modo più semplice di procedere. Dipende anche da quante funzionalità di.mat si desidera supportare.

Ho scritto uno script Python "piccolo" (circa 700 righe) in grado di leggere alcuni file di base .mat. Non sono né un esperto di Python né un principiante e mi ci sono voluti circa due giorni per scriverlo (usando la documentazione di MathWorks collegata sopra). Ho imparato molte cose nuove ed è stato abbastanza divertente (la maggior parte delle volte). Mentre ho scritto la sceneggiatura di Python al lavoro, temo di non poterla pubblicare ... Ma posso dare qualche consiglio qui:

  • Prima leggi la documentazione.
  • Utilizzare un editor esadecimale (come HxD ) e cercare un .matfile di riferimento che si desidera analizzare.
  • Prova a capire il significato di ogni byte salvando i byte in un file .txt e annota ogni riga.
  • Utilizzare le classi di salvare ogni elemento di dati (ad esempio miCOMPRESSED, miMATRIX, mxDOUBLE, o miINT32)
  • La .matstruttura dei file è ottimale per salvare gli elementi di dati in una struttura di dati ad albero; ogni nodo ha una classe e nodi secondari

9
Questa è una documentazione in qualche modo folle fornita da Mathworks. 40 pagine che spiegano il formato, senza menzionare che si tratta di un sottoinsieme di HDF5.
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)

Puoi usare il codice sopra per leggere il file .mat salvato predefinito in Python.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.