Читайте .mat файли в Python


383

Чи можна читати бінарні файли MATLAB .mat в Python?

Я бачив, що у SciPy є нібито підтримка читання файлів .mat, але я з цим не вдається. Я встановив SciPy версії 0.7.0, і я не можу знайти loadmat()метод.

Відповіді:


517

Потрібно імпортувати, import scipy.io...

import scipy.io
mat = scipy.io.loadmat('file.mat')

6
Офіційний підручник SciPy.io: docs.scipy.org/doc/scipy/reference/tutorial/io.html
Франк

18
scipy не підтримує v7.3 mat-файли (див. примітки тут ). Дивіться відповідь від vikrantt для рішення.
текстовий

проте ви можете зберегти mat-файли як попередні версії. дивіться: mathworks.com/help/matlab/import_export/mat-file-versions.html (заголовок: "Зберегти до не за замовчуванням версії MAT-файлу")
watsonic

5
наприкладsave('myfile.mat','-v7')
Watsonic

149

Ні 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

6
Це прекрасно працює, якщо ви використовуєте прапор '-v7.3' в Matlab під час збереження даних. Використання за замовчуванням save(принаймні в Matlab R2014b) призводить до файлу, який неможливо прочитати, використовуючи вищезазначену техніку. Якщо ви використовуєте прапор '-v7.3', числові дані можна прочитати чудово.
chipaudette

3
Так, це я сказав у своєму дописі. Вам потрібно використовувати -v7.3, зберігаючи в Matlab. Ви повинні робити це будь-коли, оскільки він використовує кращий / більш підтримуваний / стандартизований формат.
vikrantt

4
Чи можете ви пояснити, яке співвідношення між f та даними у вашому прикладі? Як я можу перемістити f до масивного ряду?
heracho

Збережіть змінну за допомогою цієї команди з підказки:save('filename', '-v7.3', 'var1');
Кевін Кацке

23

Спочатку збережіть .mat файл як:

save('test.mat', '-v7')

Після цього в Python використовуйте звичайну loadmatфункцію:

import scipy.io as sio
test = sio.loadmat('test.mat')

15

Є приємний пакет, 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 дає вам схоже на json дерево диктів, списків, списків списків ... - зовсім не нуме. ( mat4py/cmd.py my.matпише my.json, 1 довгий рядок.)
denis

1
@denis: Так, це також сказано вище. Але справді хороший момент: мені зазвичай подобається така структура, наприклад, у веб-додатках, оскільки нумерові масиви не є JSON-серіалізаційними .
Клеб

Зустрілися:mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
s2t2

@ s2t2: ніколи раніше не стикався з цим питанням. Яку версію матлаба та яку наукову версію ви використовуєте?
Клеб

ParseError: Несподівана довжина імені поля: 43
Aleksejs Fomins

13

Встановивши MATLAB 2014b або новішу версію, двигун MATLAB для Python може бути використаний:

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)

Я отримав цю помилку: ModuleNotFoundError: Немає модуля під назвою "pylab".
Дощ

3
Ви отримали помилку під час спроби відповіді? Це дивно, але в ньому не використовується пілаб.
Даніель

11

Читання файлу

import scipy.io
mat = scipy.io.loadmat(file_name)

Перевірка типу змінної MAT

print(type(mat))
#OUTPUT - <class 'dict'>

У ключах всередині словника є MATLAB змінними , і значення є об'єктами , призначеними для цих змінних .


7

Також є двигун MATLAB для Python від MathWorks. Якщо у вас є MATLAB, це, можливо, варто задуматися (я сам цього не пробував, але він має набагато більше функціональних можливостей, ніж просто читання файлів MATLAB). Однак я не знаю, чи дозволяється поширювати його іншим користувачам (це, мабуть, не проблема, якщо ці особи мають MATLAB. Інакше, можливо, NumPy - це правильний шлях?).

Крім того, якщо ви хочете виконати всі основи самостійно, MathWorks надає (якщо посилання зміниться, спробуйте перейти в Google matfile_format.pdfабо його назву MAT-FILE Format) детальну документацію про структуру файлового формату. Це не так складно, як я особисто думав, але очевидно, що це не найпростіший шлях. Це також залежить від того, скільки можливостей .matфайлів-файлів ви хочете підтримувати.

Я написав "невеликий" (близько 700 рядків) сценарій Python, який може прочитати основні .matфайли. Я ні експерт Python, ні початківець, і мені знадобилося близько двох днів, щоб написати це (використовуючи вищезазначену документацію MathWorks). Я дізнався багато нового і це було досить весело (більшість часу). Коли я писав сценарій Python на роботі, я боюся, що не можу його опублікувати ... Але я можу дати поради тут:

  • Спочатку прочитайте документацію.
  • Використовуйте шестнадцятковий редактор (наприклад, HxD ) і перегляньте файл-посилання, який .matви хочете проаналізувати.
  • Спробуйте розібратися у значенні кожного байта, зберігаючи байти у .txt-файл та примічайте кожен рядок.
  • Використовуйте класи для збереження кожного елемента даних (наприклад miCOMPRESSED, miMATRIX, mxDOUBLEабо miINT32)
  • Структура .mat-файлів оптимальна для збереження елементів даних у структурі даних дерева; кожен вузол має один клас та підрозділи

9
Це якось божевільна документація, яку надає математика. 40 сторінок, що пояснюють формат, не зазначаючи, що це підмножина HDF5.
Даніель

-1
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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.