2012-06-12 26 views
21

Ich bin auf der Suche nach einer Möglichkeit, NumPy-Arrays Matlab übergeben."Konvertieren" Numpy-Arrays in Matlab und umgekehrt

Ich habe es geschaffen, dies zu tun durch das Array in einen Bildspeicher scipy.misc.imsave verwenden und es dann imread mit Laden, aber dies natürlich bewirkt, dass die Matrixwerte zwischen 0 und 256 anstelle der ‚echten‘ Werte enthalten.

Nimmt man das Produkt dieser Matrix dividiert durch 256, und der Maximalwert im ursprünglichen NumPy-Array gibt mir die richtige Matrix, aber ich fühle, dass dies ein bisschen langweilig ist.

gibt es einen einfacheren Weg?

+3

Ich vergesse, erlaubt Matlab Textdateien zu analysieren? Weil Sie die numpigen Arrays einfach als Matlab-artige Strings formatieren können, schreiben Sie sie in eine Datei und lesen Sie die Arrays dann in Matlab. – JAB

+1

Haben Sie in Betracht gezogen, mlabwrap http://mlabwrap.sourceforge.net/#description –

+2

Sind Sie sicher, dass Sie die Berechnung nicht vollständig in numpy/scipy tun können? nur wundernd – Bort

Antwort

35

Sicher, benutzen Sie einfach scipy.io.savemat

Als Beispiel:

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

Ebenso gibt es scipy.io.loadmat.

Dann laden Sie diese in Matlab mit load test.

Alternativ, wie @JAB vorgeschlagen, können Sie einfach Dinge in eine ASCII-Tabulator-getrennte Datei speichern (z. B. numpy.savetxt). Sie werden jedoch auf 2 Dimensionen beschränkt, wenn Sie diese Route gehen. Auf der anderen Seite ist ascii das universelle Austauschformat. So ziemlich alles wird mit einer Textdatei mit Trennzeichen umgehen.

+0

so das erlaubt es, ein numpy Array in eine Datei zu speichern und es dann von Matlab mit etwas wie 'load ('test.mat')' 'lesen zu lassen? –

2

Vor einiger Zeit hatte ich das gleiche Problem und schrieb die folgenden Skripte, um das einfache Kopieren und Einfügen von Arrays aus interaktiven Sitzungen zu ermöglichen. Offensichtlich nur praktisch für kleine Arrays, aber ich fand es bequemer als Speichern/Laden durch eine Datei jedes Mal: ​​

Matlab -> Python

Python -> Matlab

4

scipy.io.savemat oder scipy.io.loadmat nicht Arbeit für Matlab-Arrays --v7.3. Aber der gute Teil ist, dass Matlab - v7.3 Dateien sind hdf5 Datensätze. So können sie mit einer Reihe von Tools gelesen werden, einschließlich numpy.

Für Python benötigen Sie die Erweiterung h5py, die auf Ihrem System HDF5 erfordert.

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

Eine einfache Lösung, ohne die Daten durch Datei oder externe libs vorbei.

Numpy verfügt über eine Methode zum Umwandeln von NDarrays in Listen und Matlab-Datentypen können aus Listen definiert werden. Also, wenn verwandeln kann wie:

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

Von Matlab Python mehr Aufmerksamkeit erfordert. Es gibt keine eingebaute Funktion, um den Typ direkt in Listen zu konvertieren. Aber wir können auf die Rohdaten zugreifen, die nicht geformt, sondern einfach sind. Also, wir verwenden reshape (um richtig zu formatieren) und transpose (wegen der unterschiedlichen Art und Weise MATLAB und numpy speichern Daten). Das ist wirklich wichtig zu betonen: Testen Sie es in Ihrem Projekt, vor allem, wenn Sie Matrizen mit mehr als 2 Dimensionen verwenden. Es funktioniert für MATLAB 2015a und 2 Dims.

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

Beachten Sie, dass 'mat_a = matlab.double (np_a.tolist())' furchtbar ineffizient/langsam sein kann. Gehen Sie mit Joe Kingtons Antwort für alles andere als np-Arrays. Siehe https://StackOverflow.com/a/45284125/2524427 – 5Ke

Verwandte Themen