Czy w Pythonie można odczytać binarne pliki MATLAB .mat?
Widziałem, że SciPy rzekomo wspiera czytanie plików .mat, ale mi się nie udaje. Zainstalowałem SciPy w wersji 0.7.0 i nie mogę znaleźć loadmat()
metody.
Czy w Pythonie można odczytać binarne pliki MATLAB .mat?
Widziałem, że SciPy rzekomo wspiera czytanie plików .mat, ale mi się nie udaje. Zainstalowałem SciPy w wersji 0.7.0 i nie mogę znaleźć loadmat()
metody.
Odpowiedzi:
Wymagany jest import import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
Ani scipy.io.savemat
nie scipy.io.loadmat
działa dla tablic MATLAB w wersji 7.3. Ale dobrą stroną jest to, że pliki MATLAB w wersji 7.3 są zestawami danych hdf5. Aby można je było odczytać za pomocą wielu narzędzi, w tym NumPy .
W przypadku Pythona potrzebujesz h5py
rozszerzenia, które wymaga HDF5 w twoim systemie.
import numpy as np
import h5py
f = h5py.File('somefile.mat','r')
data = f.get('data/variable1')
data = np.array(data) # For converting to a NumPy array
save
(przynajmniej w Matlab R2014b) powoduje powstanie pliku, którego nie można odczytać przy użyciu powyższej techniki. Jeśli użyjesz flagi „-v7.3”, dane liczbowe można odczytać w porządku.
save('filename', '-v7.3', 'var1');
Najpierw zapisz plik .mat jako:
save('test.mat', '-v7')
Następnie w Pythonie użyj zwykłej loadmat
funkcji:
import scipy.io as sio
test = sio.loadmat('test.mat')
Jest ładny pakiet o nazwie, mat4py
który można łatwo zainstalować za pomocą
pip install mat4py
Korzystanie z witryny jest proste:
Załaduj dane z pliku MAT
Funkcja loadmat
ładuje wszystkie zmienne przechowywane w pliku MAT do prostej struktury danych Pythona, używając tylko Pythona dict
i list
obiektów. Tablice numeryczne i komórkowe są konwertowane na zagnieżdżone listy uporządkowane w wierszach. Tablice są ściśnięte, aby wyeliminować tablice zawierające tylko jeden element. Wynikowa struktura danych składa się z prostych typów zgodnych z JSON formatem .
Przykład: Załaduj plik MAT do struktury danych Python:
from mat4py import loadmat
data = loadmat('datafile.mat')
Zmienna data
zawiera dict
zmienne i wartości zawarte w pliku MAT.
Zapisz strukturę danych Python w pliku MAT
Dane w języku Python można zapisać w pliku MAT za pomocą funkcji savemat
. Dane muszą być skonstruowane w taki sam sposób jak w przypadku loadmat
, czyli powinien być złożony z prostych typów danych, takich jak dict
, list
, str
, int
, ifloat
.
Przykład: Zapisz strukturę danych Python w pliku MAT:
from mat4py import savemat
savemat('datafile.mat', data)
Parametr data
powinien być dict
zmienny.
mat4py/cmd.py my.mat
pisze my.json
, 1 długa linia.)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
Po zainstalowaniu MATLAB 2014b lub nowszego można użyć silnika MATLAB dla Pythona :
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Istnieje również silnik MATLAB dla Pythona opracowany przez MathWorks. Jeśli masz MATLAB, warto to rozważyć (sam tego nie próbowałem, ale ma o wiele więcej funkcji niż tylko czytanie plików MATLAB). Nie wiem jednak, czy wolno go rozpowszechniać innym użytkownikom (prawdopodobnie nie ma problemu, jeśli osoby te mają MATLAB. W przeciwnym razie może NumPy jest właściwą drogą?).
Ponadto, jeśli chcesz zrobić wszystkie podstawy sam, MathWorks zapewnia (jeśli link się zmieni, spróbuj googlematfile_format.pdf
lub jego tytuł MAT-FILE Format
) szczegółową dokumentację dotyczącą struktury formatu pliku. Nie jest to tak skomplikowane, jak osobiście myślałem, ale oczywiście nie jest to najłatwiejsza droga. Zależy to również od tego, ile funkcji .mat
-plików chcesz obsługiwać.
Napisałem „mały” (około 700 wierszy) skrypt w języku Python, który potrafi odczytać podstawowe .mat
pliki. Nie jestem ani ekspertem w Pythonie, ani początkującym i napisanie go zajęło mi około dwóch dni (korzystając z dokumentacji MathWorks, do której odsyłam powyżej). Nauczyłem się wielu nowych rzeczy i było całkiem fajnie (przez większość czasu). Ponieważ napisałem skrypt Pythona w pracy, obawiam się, że nie mogę go opublikować ... Ale mogę tu udzielić porady:
.mat
który chcesz przeanalizować.miCOMPRESSED
, miMATRIX
, mxDOUBLE
, lub miINT32
).mat
plików jest optymalna do zapisywania elementów danych w strukturze danych drzewa; każdy węzeł ma jedną klasę i podwęzłyfrom os.path import dirname, join as pjoin
import scipy.io as sio
data_dir = pjoin(dirname(sio.__file__), 'matlab', 'tests', 'data')
mat_fname = pjoin(data_dir, 'testdouble_7.4_GLNX86.mat')
mat_contents = sio.loadmat(mat_fname)
Możesz użyć powyższego kodu, aby odczytać domyślnie zapisany plik .mat w Pythonie.