2012-06-12 8 views
21

Estoy buscando una manera de pasar matrices NumPy a Matlab."Conversión" de matrices Numpy en Matlab y viceversa

He logrado hacer esto almacenando la matriz en una imagen usando scipy.misc.imsave y luego cargándola usando imread, pero esto por supuesto hace que la matriz contenga valores entre 0 y 256 en lugar de los valores 'reales'.

Tomando el producto de esta matriz dividido por 256, y el valor máximo en la matriz NumPy original me da la matriz correcta, pero creo que esto es un poco tedioso.

¿hay alguna manera más simple?

+3

Me olvido, ¿permite Matlab analizar archivos de texto? Porque podría simplemente formatear las matrices numpy como cadenas estilo Matlab en cadenas, escribirlas en un archivo y luego leer las matrices en Matlab. – JAB

+1

¿Consideró que mlabwrap http://mlabwrap.sourceforge.net/#description –

+2

está seguro de que no puede hacer el cálculo completamente en numpy/scipy? Me pregunto – Bort

Respuesta

35

Claro, sólo tiene que utilizar scipy.io.savemat

A modo de ejemplo:

import numpy as np 
import scipy.io 

x = np.linspace(0, 2 * np.pi, 100) 
y = np.cos(x) 

scipy.io.savemat('test.mat', dict(x=x, y=y)) 

Del mismo modo, hay scipy.io.loadmat.

A continuación, carga esto en matlab con load test.

Alterativamente, como sugirió @JAB, podría guardar cosas en un archivo delimitado por tabulaciones de ASCII (por ejemplo, numpy.savetxt). Sin embargo, estará limitado a 2 dimensiones si sigue esta ruta. Por otro lado, ascii es el formato de intercambio universal. Prácticamente cualquier cosa manejará un archivo de texto delimitado.

+0

por lo que este permite guardar una matriz numpy en un archivo y luego hacer que sea leído por matlab con algo como 'load ('test.mat')'? –

2

Hace algún tiempo tuve el mismo problema y escribí las siguientes secuencias de comandos para permitir copiar y pegar fácilmente las matrices de las sesiones interactivas hacia adelante y hacia atrás. Obviamente sólo es práctico para las pequeñas matrices, pero me pareció más conveniente que guardar/cargar a través de un archivo cada vez:

Matlab -> Python

Python -> Matlab

4

scipy.io.savemat o no scipy.io.loadmat trabajo para 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, h5py 
f = h5py.File('somefile.mat','r') 
data = f.get('data/variable1') 
data = np.array(data) # For converting to numpy array 
6

Una solución simple, sin pasar datos por archivo o libs externos.

Numpy tiene un método para transformar ndarrays en listas y los tipos de datos matlab se pueden definir a partir de listas. Por lo tanto, cuando se puede transformar como:

np_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) 
mat_a = matlab.double(np_a.tolist()) 

De matlab a python requiere más atención. No hay una función incorporada para convertir el tipo directamente a listas. Pero podemos acceder a los datos brutos, que no tienen forma, pero son simples. Entonces, usamos reshape (para formatear correctamente) y transpose (debido a la diferente forma en que MATLAB y numpy almacenan datos). Eso es realmente importante para el estrés: pruébelo en su proyecto, principalmente si está usando matrices con más de 2 dimensiones. Funciona para MATLAB 2015a y 2 dim.

np_a = np.array(mat_a._data.tolist()) 
np_a = np_a.reshape(mat_a.size).transpose() 
+0

Tenga en cuenta que 'mat_a = matlab.double (np_a.tolist())' puede ser terriblemente ineficiente/lento. Ve con la respuesta de Joe Kington para cualquier cosa que no sean matrices np. Ver https://stackoverflow.com/a/45284125/2524427 – 5Ke

Cuestiones relacionadas