È 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.
È 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:
È richiesta un'importazione, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
Né funziona scipy.io.savemat
né scipy.io.loadmat
per 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 h5py
dell'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
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.
save('filename', '-v7.3', 'var1');
Prima salva il file .mat come:
save('test.mat', '-v7')
Dopodiché, in Python, usa la solita loadmat
funzione:
import scipy.io as sio
test = sio.loadmat('test.mat')
C'è un bel pacchetto chiamato mat4py
che può essere facilmente installato usando
pip install mat4py
È semplice da usare (dal sito Web):
Carica dati da un file MAT
La funzione loadmat
carica tutte le variabili memorizzate nel file MAT in una semplice struttura di dati Python, usando solo Python dict
e list
oggetti. 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 dict
con 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 data
deve essere a dict
con le variabili.
mat4py/cmd.py my.mat
scrive my.json
, 1 linea lunga.)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
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)
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.pdf
o 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:
.mat
file di riferimento che si desidera analizzare.miCOMPRESSED
, miMATRIX
, mxDOUBLE
, o miINT32
).mat
struttura dei file è ottimale per salvare gli elementi di dati in una struttura di dati ad albero; ogni nodo ha una classe e nodi secondarifrom 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.