Читать файлы.mat в Python
У кого-нибудь есть успешный опыт чтения бинарных файлов Matlab .mat на Python?
(Я видел это scipy
Якобы поддерживает чтение файлов.mat, но мне это не удается. Я установил scipy
версия 0.7.0, и я не могу найти loadmat()
метод)
18 ответов
Дурак я. Забыл импортировать IO...
import scipy.io
mat = scipy.io.loadmat('file.mat')
Ни scipy.io.savemat
ни scipy.io.loadmat
работа для массивов matlab -v7.3. Но хорошая часть заключается в том, что файлы matlab --v7.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 numpy array
Я прикрутил полчаса даже после прочтения ответов. Надеюсь, этот ответ поможет
Сначала сохраните файл мата как
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:
data = loadmat('datafile.mat')
Переменная data
это dict
с переменными и значениями, содержащимися в MAT-файле.
Сохранить структуру данных Python в MAT-файл
Данные Python могут быть сохранены в MAT-файл с помощью функции savemat
, Данные должны быть структурированы так же, как и для loadmat
т.е. он должен состоять из простых типов данных, таких как dict
, list
, str
, int
а также float
,
Пример: сохранить структуру данных Python в MAT-файл:
savemat('datafile.mat', data)
Параметр data
должен быть dict
с переменными.
Установив Matlab 2014b или новее, можно использовать движок Matlab для Python:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat",nargout=1)
Для этой задачи есть отличная библиотека:
pymatreader
.
Просто сделайте следующее:
Установите пакет:
pip install pymatreader
Импортируйте соответствующую функцию этого пакета:
from pymatreader import read_mat
Используйте функцию для чтения структуры Matlab:
data = read_mat('matlab_struct.mat')
использовать
data.keys()
чтобы определить, где на самом деле хранятся данные.
- Ключи обычно выглядят так:
dict_keys(['__header__', '__version__', '__globals__', 'data_opp'])
. Гдеdata_opp
будет фактическим ключом, в котором хранятся данные. Имя этого ключа, конечно, может быть изменено между разными файлами.
- Последний шаг - Создайте фрейм данных:
my_df = pd.DataFrame(data['data_opp'])
Это оно :)
Чтение файла
import scipy.io
mat = scipy.io.loadmat(file_name)
Пересечение типа переменной мата
print(type(mat))
#OUTPUT - <class 'dict'>
Ключи внутри словаря являются переменными Matlab, а значения являются объектами, назначенными этим переменным.
Чтобы прочитать файл mat в pandas dataFrame со смешанными типами данных
mat=sio.loadmat('file.mat')# load mat-file
mdata = mat['myVar'] # variable in mat file
ndata = {n: mdata[n][0,0] for n in mdata.dtype.names}
Columns = [n for n, v in ndata.items() if v.size == 1]
d=dict((c, ndata[c][0]) for c in Columns)
df=pd.DataFrame.from_dict(d)
display(df)
Существует также движок MATLAB для Python от самой MathWorks. Если у вас есть Matlab, это, возможно, стоит рассмотреть (я сам не пробовал, но у него гораздо больше функциональности, чем просто чтение файлов Matlab). Тем не менее, я не знаю, разрешено ли распространять его другим пользователям (вероятно, нет проблем, если у этих людей есть Matlab, в противном случае, возможно, NumPy - правильный путь?).
Кроме того, если вы хотите сделать все основы самостоятельно, MathWorks предоставляет (если ссылка меняется, попробуйте Google для matfile_format.pdf
или его название MAT-FILE Format
) подробная документация по структуре формата файла. Это не так сложно, как я лично думал, но, очевидно, это не самый простой путь. Это также зависит от того, сколько функций .mat
-файлы, которые вы хотите поддержать.
Я написал "маленький" (около 700 строк) Python-скрипт, который может читать некоторые основные .mat
-файлы. Я не эксперт по Python и не новичок, и мне потребовалось около двух дней, чтобы написать его (используя документацию MathWorks, связанную выше). Я узнал много нового, и это было довольно весело (большую часть времени). Поскольку я написал скрипт Python на работе, я боюсь, что не могу его опубликовать... Но я могу дать несколько советов здесь:
- Сначала прочитайте документацию
- Используйте HEX-редактор (например, HxD) и посмотрите ссылку
.mat
-файл вы хотите разобрать - Попробуйте выяснить значение каждого байта, сохранив байты в текстовый файл и аннотируя каждую строку
- Используйте классы для сохранения каждого элемента данных (например,
miCOMPRESSED
,miMATRIX
,mxDOUBLE
или жеmiINT32
) .mat
структура -files оптимальна для сохранения элементов данных в древовидной структуре данных; каждый узел имеет один класс и подузлы
Помимо файлов matfiles v4 (уровень 1.0), v6, v7 - 7.2 и файлов mat формата 7.3, существует другой тип файлов mat в текстовом формате вместо двоичного, обычно создаваемый Octave, который даже не может быть прочитан в MATLAB.
Оба
scipy.io.loadmat
а также
h5py.File
не могу их загрузить (проверено на scipy 1.5.3 и h5py 3.1.0), и единственное решение, которое я нашел, -
numpy.loadtxt
.
import numpy as np
mat = np.loadtxt('xxx.mat')
Также можно использовать библиотеку hdf5storage. официальная документация здесь для получения подробной информации о поддержке версии Matlab.
import hdf5storage
label_file = "./LabelTrain.mat"
out = hdf5storage.loadmat(label_file)
print(type(out)) # <class 'dict'>
Установить Скайпи
pip install scipy
Импортируйте модуль scipy.io.loadmat.
from scipy.io import loadmat
annots = loadmat('annotation_0001.mat')
print(annots)
- Разобрать файловую структуру .mat
con_list = [[element for element in upperElement] for upperElement in annots['obj_contour']]
- Используйте фреймы данных Pandas для работы с данными
import pandas as pd
newData = list(zip(con_list[0], con_list[1]))
columns = ['obj_contour_x', 'obj_contour_y']
df = pd.DataFrame(newData, columns=columns)
ссылка:https://www.askpython.com/python/examples/mat-files-in-python
Файлы hdf5 также могут быть обработаны с помощью PyTables. В их FAQ есть запись, которая сравнивается с h5py: https://pytables.github.io/FAQ.html. PyTables также поставляется с удобным визуализатором ViTables: http://vitables.org/galleries/Screenshots/
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.
После того, как я сам боролся с этой проблемой и пробовал другие библиотеки (я должен сказать, что mat4py тоже хорош, но с некоторыми ограничениями), я создал эту библиотеку ("matdata2py"), которая может обрабатывать большинство типов переменных и, что наиболее важно для меня, типа "строка". Файл .mat необходимо сохранить в версии -V7.3. Я надеюсь, что это может быть полезно для сообщества.
Монтаж:
pip install matdata2py
Как использовать эту библиотеку:
import matdata2py as mtp
Чтобы загрузить файл данных Matlab:
Variables_output = mtp.loadmatfile(file_Name, StructsExportLikeMatlab = True, ExportVar2PyEnv = False)
print(Variables_output.keys()) # with ExportVar2PyEnv = False the variables are as elements of the Variables_output dictionary.
с ExportVar2PyEnv = True вы можете видеть каждую переменную отдельно как переменную Python с тем же именем, которое сохранено в файле Mat.
Описание флагов
StructsExportLikeMatlab = Структуры True/False экспортируются в формате словаря (False) или в точечном формате, аналогичном Matlab (True)
ExportVar2PyEnv = True/False экспортировать все переменные в один словарь (True) или как отдельные переменные в среду python (False)
Для больших размеров, пакет mat4py работает лучше:
from mat4py import loadmat
data = loadmat('datafile.mat')
Загружать и читать матовые файлы в python
- Устанавливаем mat4py в python. При успешной установке получаем:
- Успешно установлен mat4py-0.5.0.
- Импорт loadmat из mat4py.
- Сохранить фактическое местоположение файла внутри переменной.
- Загрузите формат файла мата в значение данных, используя python
pip install mat4py
from mat4py import loadmat
boston = r"E:\Downloads\boston.mat"
data = loadmat(boston, meta=False)
scipy отлично подойдет для загрузки файлов .mat. И мы можем использовать функцию get(), чтобы преобразовать его в массив numpy.
mat = scipy.io.loadmat('point05m_matrix.mat')
x = mat.get("matrix")
print(type(x))
print(len(x))
plt.imshow(x, extent=[0,60,0,55], aspect='auto')
plt.show()