Чи можна читати бінарні файли 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.