Читать файлы.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.

Просто сделайте следующее:

  1. Установите пакет: pip install pymatreader

  2. Импортируйте соответствующую функцию этого пакета: from pymatreader import read_mat

  3. Используйте функцию для чтения структуры Matlab: data = read_mat('matlab_struct.mat')

  4. использовать data.keys() чтобы определить, где на самом деле хранятся данные.

  • Ключи обычно выглядят так: dict_keys(['__header__', '__version__', '__globals__', 'data_opp']). Где data_oppбудет фактическим ключом, в котором хранятся данные. Имя этого ключа, конечно, может быть изменено между разными файлами.
  1. Последний шаг - Создайте фрейм данных: 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'>
  1. Установить Скайпи

    pip install scipy

  2. Импортируйте модуль scipy.io.loadmat.

           from scipy.io import loadmat
      annots = loadmat('annotation_0001.mat')
      print(annots)
  1. Разобрать файловую структуру .mat
         con_list = [[element for element in upperElement] for upperElement in annots['obj_contour']]
  1. Используйте фреймы данных 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

  1. Устанавливаем mat4py в python. При успешной установке получаем:
  2. Успешно установлен mat4py-0.5.0.
  3. Импорт loadmat из mat4py.
  4. Сохранить фактическое местоположение файла внутри переменной.
  5. Загрузите формат файла мата в значение данных, используя 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()
Другие вопросы по тегам