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.savematnie scipy.io.loadmatdział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 h5pyrozszerzenia, 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 loadmatfunkcji:
import scipy.io as sio
test = sio.loadmat('test.mat')
Jest ładny pakiet o nazwie, mat4pyktó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 dicti listobiektó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 datazawiera dictzmienne 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 datapowinien być dictzmienny.
mat4py/cmd.py my.matpisze 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 .matpliki. 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:
.matktóry chcesz przeanalizować.miCOMPRESSED, miMATRIX, mxDOUBLE, lub miINT32).matplikó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.