Чи можна читати бінарні файли MATLAB .mat в Python?
Я бачив, що у SciPy є нібито підтримка читання файлів .mat, але я з цим не вдається. Я встановив SciPy версії 0.7.0, і я не можу знайти loadmat()метод.
Чи можна читати бінарні файли MATLAB .mat в Python?
Я бачив, що у SciPy є нібито підтримка читання файлів .mat, але я з цим не вдається. Я встановив SciPy версії 0.7.0, і я не можу знайти loadmat()метод.
Відповіді:
Потрібно імпортувати, import scipy.io...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
Ні scipy.io.savemat, ні scipy.io.loadmatробота для масивів MATLAB версії 7.3. Але добре, що файли MATLAB версії 7.3 є наборами даних hdf5. Тож їх можна прочитати за допомогою ряду інструментів, включаючи NumPy .
Для Python вам знадобиться h5pyрозширення, яке вимагає HDF5 у вашій системі.
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(принаймні в Matlab R2014b) призводить до файлу, який неможливо прочитати, використовуючи вищезазначену техніку. Якщо ви використовуєте прапор '-v7.3', числові дані можна прочитати чудово.
save('filename', '-v7.3', 'var1');
Спочатку збережіть .mat файл як:
save('test.mat', '-v7')
Після цього в Python використовуйте звичайну loadmatфункцію:
import scipy.io as sio
test = sio.loadmat('test.mat')
Є приємний пакет, mat4pyякий називається, який можна легко встановити за допомогою
pip install mat4py
Просте використання (з веб-сайту):
Завантажте дані з файлу MAT
Функція loadmatзавантажує всі змінні, що зберігаються у файлі MAT, у просту структуру даних Python, використовуючи лише Python dictта listоб'єкти. Числові масиви та масиви комірок перетворюються на впорядковані рядки вкладені списки. Масиви видавлюються для усунення масивів лише з одним елементом. Отримана структура даних складається з простих типів, сумісних з форматом JSON .
Приклад: Завантажте файл MAT у структуру даних Python:
from mat4py import loadmat
data = loadmat('datafile.mat')
Змінна data- це a dictзі змінними та значеннями, що містяться у файлі MAT.
Збережіть структуру даних Python у файлі MAT
Дані Python можна зберегти в MAT-файл, з функцією savemat. Дані повинні бути структуровані таким же чином , як і для loadmat, тобто вона повинна складатися з простих типів даних, як dict, list, str, int, і float.
Приклад: Збережіть структуру даних Python у файлі MAT:
from mat4py import savemat
savemat('datafile.mat', data)
Параметр dataповинен бути a dictзі змінними.
mat4py/cmd.py my.matпише my.json, 1 довгий рядок.)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
Встановивши MATLAB 2014b або новішу версію, двигун MATLAB для Python може бути використаний:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Також є двигун MATLAB для Python від MathWorks. Якщо у вас є MATLAB, це, можливо, варто задуматися (я сам цього не пробував, але він має набагато більше функціональних можливостей, ніж просто читання файлів MATLAB). Однак я не знаю, чи дозволяється поширювати його іншим користувачам (це, мабуть, не проблема, якщо ці особи мають MATLAB. Інакше, можливо, NumPy - це правильний шлях?).
Крім того, якщо ви хочете виконати всі основи самостійно, MathWorks надає (якщо посилання зміниться, спробуйте перейти в Google matfile_format.pdfабо його назву MAT-FILE Format) детальну документацію про структуру файлового формату. Це не так складно, як я особисто думав, але очевидно, що це не найпростіший шлях. Це також залежить від того, скільки можливостей .matфайлів-файлів ви хочете підтримувати.
Я написав "невеликий" (близько 700 рядків) сценарій Python, який може прочитати основні .matфайли. Я ні експерт Python, ні початківець, і мені знадобилося близько двох днів, щоб написати це (використовуючи вищезазначену документацію MathWorks). Я дізнався багато нового і це було досить весело (більшість часу). Коли я писав сценарій Python на роботі, я боюся, що не можу його опублікувати ... Але я можу дати поради тут:
.matви хочете проаналізувати.miCOMPRESSED, miMATRIX, mxDOUBLEабо miINT32).mat-файлів оптимальна для збереження елементів даних у структурі даних дерева; кожен вузол має один клас та підрозділиfrom 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)
Ви можете скористатися вище кодом, щоб прочитати збережений за замовчуванням .mat файл у Python.