2009-05-17 58 views
234

¿Alguien tiene experiencia exitosa leyendo archivos MatLM matlab binarios en Python?Lectura de archivos .mat en Python

(he visto que scipy ha supuesto apoyo para la lectura de archivos .mat, pero estoy sin éxito con él. He instalado scipy versión 0.7.0, y no puedo encontrar el método loadmat())

Respuesta

339

Tonto de mí. Se olvidó de importar io ...

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

Tutorial oficial de SciPy.io: http://docs.scipy.org/doc/scipy/reference/tutorial/io.html –

+13

scipy no es compatible con v7.3 mat-files (ver notas [aquí] (http : //docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.io.loadmat.html)). Vea la [respuesta de vikrantt] (http://stackoverflow.com/a/19340117/674976) para la solución. – texnic

+0

sin embargo, puede guardar archivos mat como versiones anteriores. ver: http://www.mathworks.com/help/matlab/import_export/mat-file-versions.html (encabezado: 'Guardar en la versión del archivo MAT no predeterminado') – watsonic

92

Ni scipy.io.savemat, ni scipy.io.loadmat trabajo para las matrices de MATLAB --v7.3. Pero lo bueno es que los archivos de matlab - v7.3 son conjuntos de datos hdf5. Para que puedan leerse usando una cantidad de herramientas, incluyendo numpy.

Para python, necesitará la extensión h5py, que requiere HDF5 en su 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 numpy array 
+3

Esto funciona bien, si usa el indicador '-v7.3' en Matlab al guardar sus datos. Usar el 'save' predeterminado (al menos en Matlab R2014b) da como resultado un archivo que no se puede leer utilizando la técnica anterior. Si usa el indicador '-v7.3', los datos numéricos pueden leerse muy bien. – chipaudette

+2

Sí, eso es lo que dije en mi publicación. Debe usar -v7.3 mientras guarda en Matlab. Debe hacerlo de todos modos, ya que utiliza un formato mejor/más compatible/estandarizado. – vikrantt

+2

¿Podría explicar cuál es la relación entre _f_ y _data_ en su ejemplo? ¿Cómo puedo mover _f_ a una matriz numpy? – heracho

4

También está el MATLAB Engine for Python de MathWorks sí mismo. Si tiene Matlab, esto podría valer la pena (no lo he probado, pero tiene mucha más funcionalidad que solo leer archivos de Matlab). Sin embargo, no sé si está permitido distribuirlo a otros usuarios (probablemente no haya problema si esas personas tienen Matlab, de lo contrario tal vez NumPy sea el camino correcto).

Además, si usted quiere hacer todo lo básico a sí mismo, MathWorks provides (si los cambios de enlaces, tratan de Google para matfile_format.pdf o su título MAT-FILE Format) una documentación detallada sobre la estructura del formato de archivo. No es tan complicado como yo personalmente pensé, pero obviamente, esta no es la forma más fácil de hacerlo. También depende de la cantidad de características de los archivos .mat que quiera admitir.

He escrito un script "pequeño" (alrededor de 700 líneas) de Python que puede leer algunos archivos básicos .mat. No soy ni un experto en Python ni un principiante y me llevó cerca de dos días escribirlo (utilizando la documentación de MathWorks vinculada anteriormente). Aprendí muchas cosas nuevas y fue bastante divertido (la mayoría de las veces). Como he escrito el guión de Python en el trabajo, me temo que no puedo publicarla ... Pero puedo dar algunos consejos aquí:

  • Primera leer la documentación
  • Utilice un editor hexadecimal (como HxD) y buscar en una referencia .mat -file desea analizar
  • tratar de averiguar el significado de cada byte por el ahorro de los bytes de un archivo txt y anotar cada línea
  • uso clases de ahorrar cada dato elemento (como miCOMPRESSED, miMATRIX, mxDOUBLE o miINT32)
  • La estructura de archivos .mat es óptima para guardar los elementos de datos en una estructura de datos de árbol; cada nodo tiene una clase y subnodos
+7

Esa es de alguna manera una documentación loca provista por mathworks. 40 páginas que explican el formato, sin mencionar que es un subconjunto de HDF5. – Daniel

+0

es tu código en github en cualquier lugar? – ErroriSalvo

+1

@ErroriSalvo No, lo siento. Lo hice en el trabajo, no en mi tiempo libre, así que no puedo compartir el código. Además, nunca lo pulió realmente, era más una prueba de concepto. – mozzbozz

6

haber instalado Matlab 2014b o más reciente, el Matlab engine for Python podría utilizarse:

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

He atornillado media hora incluso después de leer las respuestas. Espero que esta respuesta ayuda a

Primera guardar el archivo estera como

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

Después de que en Python utilizar el loadmat habitual

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

Leer el archivo

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

Insecting el tipo de mat varia ble

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

Las teclas dentro del diccionario son variables de MATLAB y los valores son los objetos asignados a esas variables.