2012-06-12 8 views
21

Szukam sposobu przekazywania tablic NumPy do Matlaba."Konwertowanie tablic Numpy na Matlab i vice versa

Udało mi się to zrobić, zapisując tablicę w obrazie za pomocą scipy.misc.imsave, a następnie ładując ją przy użyciu imread, ale to oczywiście powoduje, że macierz zawiera wartości od 0 do 256 zamiast "rzeczywistych" wartości.

Uwzględnienie iloczynu iloczynu tej macierzy przez 256, a maksymalna wartość w oryginalnej tablicy NumPy daje mi poprawną matrycę, ale uważam, że jest to trochę nudne.

jest prostszy sposób?

+3

Zapomniałem, czy Matlab pozwala na parsowanie plików tekstowych? Ponieważ możesz sformatować numpy jako macierze w stylu Matlaba w łańcuchach, zapisz je w pliku, a następnie odczytaj tablice w Matlab. – JAB

+1

Czy uważasz, że mlabwrap http://mlabwrap.sourceforge.net/#description –

+2

jesteś pewien, że nie możesz wykonać obliczeń w całości w numpy/scipy? Właśnie zastanawiam się – Bort

Odpowiedz

35

Jasne, wystarczy użyć scipy.io.savemat

Jako przykład:

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

Podobnie, istnieje scipy.io.loadmat.

Następnie załaduj to w Matlab z load test.

Alternatywnie, zgodnie z sugestią @JAB, można po prostu zapisać elementy w pliku rozdzielanym kartą ASCII (na przykład numpy.savetxt). Jeśli jednak wybierzesz tę trasę, będziesz ograniczony do 2 wymiarów. Z drugiej strony, ascii jest uniwersalnym formatem wymiany. Prawie wszystko będzie obsługiwać rozdzielany plik tekstowy.

+0

pozwala zapisać tablicę numpy do pliku, a następnie ją odczytać za pomocą programu matlab z parametrem 'load ('test.mat')'? –

2

Jakiś czas temu stanąłem przed tym samym problemem i napisałem następujące skrypty, aby umożliwić łatwe kopiowanie i wklejanie tablic tam iz powrotem z interaktywnych sesji. Oczywiście praktyczne tylko dla małych tablic, ale uważam, że to bardziej wygodne niż zapisywania/wczytywania poprzez plik za każdym razem:

Matlab -> Python

Python -> Matlab

4

scipy.io.savemat lub scipy.io.loadmat nie praca dla macierzy matlab --v7.3. Ale dobra część to to, że pliki matlab --v7.3 to zbiory danych hdf5. Dzięki temu można je odczytać za pomocą wielu narzędzi, w tym numpy.

Dla Pythona będzie potrzebne rozszerzenie h5py, które wymaga w systemie HDF5.

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

Proste rozwiązanie bez przekazywania danych przez plik lub bibliotekami zewnętrznych.

Numpy ma metodę transformacji ndarrays do listy, a typy danych matlab można zdefiniować z list. Tak więc, kiedy można przekształcić jak:

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

Od matlab do python wymaga więcej uwagi. Nie ma wbudowanej funkcji konwersji typu bezpośrednio na listy. Ale możemy uzyskać dostęp do surowych danych, które nie mają kształtu, ale są proste. Tak więc używamy reshape (do prawidłowego formatowania) i transpose (z powodu odmiennego sposobu przechowywania danych w formacie MATLAB i numpy). To bardzo ważne, aby podkreślić: przetestuj to w swoim projekcie, głównie jeśli używasz matryc z więcej niż 2 wymiarami. Działa dla MATLAB 2015a i 2 dims.

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

Zauważ, że 'mat_a = matlab.double (np_a.tolist())' może być okropnie nieefektywne/wolne. Idź z odpowiedzią Joe Kingtona na coś innego niż tablice np. Zobacz https://stackoverflow.com/a/45284125/2524427 – 5Ke

Powiązane problemy