python matlab file-io scipy mat-file

Lee archivos.mat en Python



pandas plot (8)

Con Matlab 2014b o más reciente instalado, el motor Matlab para Python podría usarse:

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

¿Alguien tiene experiencia exitosa al leer archivos binarios de Matlab en Python?

(He visto que scipy ha alegado soporte para leer archivos .mat, pero no lo he scipy . Instalé scipy versión 0.7.0 y no puedo encontrar el método loadmat() )


Hay un buen paquete llamado mat4py que se puede instalar fácilmente usando

pip install mat4py

Es fácil de usar (desde el sitio web):

Cargar datos desde el archivo MAT

La función loadmat carga todas las variables almacenadas en el archivo MAT en una estructura de datos Python simple, utilizando solo los objetos dict y list Python. Las matrices numéricas y de celdas se convierten en listas anidadas ordenadas por filas. Las matrices se comprimen para eliminarlas con un solo elemento. La estructura de datos resultante se compone de tipos simples que son compatibles con el formato JSON .

Ejemplo: cargar un archivo MAT en una estructura de datos de Python:

data = loadmat(''datafile.mat'')

Los data variables son un dict con las variables y valores contenidos en el archivo MAT.

Guardar la estructura de datos de Python en un archivo MAT

Los datos de Python se pueden guardar en un archivo MAT, con la función savemat . Los datos se deben estructurar de la misma manera que para loadmat , es decir, deben estar compuestos de tipos de datos simples, como dict , list , str , int y float .

Ejemplo: guardar una estructura de datos de Python en un archivo MAT:

savemat(''datafile.mat'', data)

Los data parámetro serán un dict con las variables.


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

Primero guarda el archivo mat como

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

Después de eso en Python usa el loadmat habitual.

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


Ni scipy.io.savemat , ni scipy.io.loadmat funcionan para matlab matrices --v7.3. Pero lo bueno es que los archivos matlab --v7.3 son conjuntos de datos hdf5. Por lo tanto, se pueden leer utilizando una serie de herramientas, incluida la 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


Para datos de alta dimensión, el paquete mat4py funciona mejor:

from mat4py import loadmat data = loadmat(''datafile.mat'')


También está el motor MATLAB para Python de MathWorks. Si tiene Matlab, podría valer la pena considerarlo (no lo he probado, pero tiene mucha más funcionalidad que solo leer los archivos de Matlab). Sin embargo, no sé si está permitido distribuirlo a otros usuarios (probablemente no hay problema si esas personas tienen Matlab, de lo contrario, ¿quizás NumPy sea el camino correcto?).

Además, si desea realizar todos los aspectos básicos, MathWorks provides (si el enlace cambia, intente buscar en el matfile_format.pdf o su título MAT-FILE Format ) una documentación detallada sobre la estructura del formato del archivo. No es tan complicado como 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 desee admitir.

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

  • Primero lea la documentación
  • Use un editor HEX (como HxD ) y busque un .mat .mat de referencia que desee analizar
  • Intente averiguar el significado de cada byte guardando los bytes en un archivo txt y anote cada línea
  • Use clases para guardar cada elemento de datos (como miCOMPRESSED , miMATRIX , mxDOUBLE o miINT32 )
  • La .mat archivos .mat es óptima para guardar los elementos de datos en una estructura de datos de árbol; Cada nodo tiene una clase y subnodos

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

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


Leyendo el archivo

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

Inserción del tipo de variable mat

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

Las claves dentro del diccionario son variables de matlab y los valores son los objetos asignados a esas variables .