2012-06-12 17 views
21

Sto cercando un modo per passare gli array NumPy a Matlab."Conversione" di array Numpy in Matlab e viceversa

Sono riuscito a farlo memorizzando la matrice in un'immagine utilizzando scipy.misc.imsave e quindi caricandola utilizzando imread, ma questo ovviamente fa sì che la matrice contenga valori compresi tra 0 e 256 invece dei valori "reali".

Prendendo il prodotto di questa matrice diviso per 256, e il valore massimo nell'array NumPy originale mi fornisce la matrice corretta, ma ritengo che questo sia un po 'noioso.

c'è un modo più semplice?

+3

Ho dimenticato, Matlab consente l'analisi dei file di testo? Perché è possibile semplicemente formattare gli array numpy come quelli in stile Matlab nelle stringhe, scriverli in un file e quindi leggere gli array in Matlab. – JAB

+1

Hai considerato mlabwrap http://mlabwrap.sourceforge.net/#description –

+2

sei sicuro di non poter eseguire il calcolo interamente in numpy/scipy? mi chiedo semplicemente – Bort

risposta

35

Certo, basta usare scipy.io.savemat

Per fare un esempio:

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)) 

Allo stesso modo, non c'è scipy.io.loadmat.

Quindi lo si carica in MATLAB con load test.

In alternativa, come suggerito da @JAB, è possibile salvare le cose in un file delimitato da una scheda ascii (ad esempio numpy.savetxt). Tuttavia, sarai limitato a 2 dimensioni se segui questo percorso. D'altro canto, ascii è il formato di scambio universale. Praticamente qualsiasi cosa gestirà un file di testo delimitato.

+0

quindi questo permette di salvare una matrice numpy in un file e quindi farla leggere da MATLAB con qualcosa come 'load ('test.mat')'? –

2

Un po 'di tempo fa ho affrontato lo stesso problema e ho scritto i seguenti script per consentire di copiare e incollare facilmente gli array avanti e indietro dalle sessioni interattive. Ovviamente pratico solo per piccoli array, ma ho trovato più conveniente di salvataggio/caricamento tramite un file ogni volta:

Matlab -> Python

Python -> Matlab

4

scipy.io.savemat o scipy.io.loadmat non lavoro per matlab matrici - v7.3. Ma la parte buona è che i file matlab -v7.3 sono dataset hdf5. Quindi possono essere letti usando un numero di strumenti, incluso numpy.

Per python, è necessario l'estensione h5py, che richiede HDF5 sul 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 soluzione semplice, senza passare i dati da file o librerie esterne.

Numpy ha un metodo per trasformare ndarrays in elenco e tipi di dati matlab possono essere definiti da elenchi. Quindi, quando può trasformarsi come:

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

Da MATLAB a Python richiede più attenzione. Non esiste una funzione incorporata per convertire il tipo direttamente negli elenchi. Ma possiamo accedere ai dati grezzi, che non sono modellati, ma semplici. Quindi, usiamo reshape (per formattare correttamente) e transpose (a causa del diverso modo in cui MATLAB e numpy memorizzano i dati). È molto importante sottolineare: testarlo nel progetto, principalmente se si utilizzano matrici con più di 2 dimensioni. Funziona per MATLAB 2015a e 2 dim.

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

Si noti che 'mat_a = matlab.double (np_a.tolist())' può essere orribilmente inefficiente/lento. Vai con la risposta di Joe Kington per qualcosa di diverso dagli array np. Vedi https://stackoverflow.com/a/45284125/2524427 – 5Ke

Problemi correlati