Чтение массива ячеек Matlab, сохраненного как файл v7.3 .mat с H5py

Я сохранил массив ячеек как .mat-файл в Matlab следующим образом:

test = {'hello'; 'world!'}; save('data.mat', 'test', '-v7.3') 

Как импортировать его как список строк в Python с H5py?

Я пытался

 f = h5py.File('data.mat', 'r') print f.get('test') print f.get('test')[0] 

Это печатает:

 <HDF5 dataset "test": shape (1, 2), type "|O8"> [<HDF5 object reference> <HDF5 object reference>] 

Как я могу разыменовать его, чтобы получить список строк ['hello', 'world!'] В Python?

3 Solutions collect form web for “Чтение массива ячеек Matlab, сохраненного как файл v7.3 .mat с H5py”

Письмо в Matlab:

 test = {'Hello', 'world!'; 'Good', 'morning'; 'See', 'you!'}; save('data.mat', 'test', '-v7.3') % v7.3 so that it is readable by h5py 

введите описание изображения здесь

Чтение в Python (работает для любого числа или строк или столбцов, но предполагает, что каждая ячейка является строкой):

 import h5py import numpy as np data = [] with h5py.File("data.mat") as f: for column in f['test']: row_data = [] for row_number in range(len(column)): row_data.append(''.join(map(unichr, f[column[row_number]][:]))) data.append(row_data) print data print np.transpose(data) 

Вывод:

 [[u'Hello', u'Good', u'See'], [u'world!', u'morning', u'you!']] [[u'Hello' u'world!'] [u'Good' u'morning'] [u'See' u'you!']] 

Этот ответ следует рассматривать как дополнение к ответу Франка Дернонкур, чего вполне достаточно для всех массивов ячеек, которые содержат «плоские» данные (для файлов матов версии 7.3 и, вероятно, выше).

Я столкнулся с ситуацией, когда у меня были вложенные данные (например, 1 строка массивов ячеек внутри массива с именованными ячейками). Мне удалось получить данные, выполнив следующие действия:

 # assumption: # idx_of_interest specifies the index of the cell array we are interested in # (at the second level) with h5py.File(file_name) as f: data_of_interest_reference = f['cell_array_name'][idx_of_interest, 0] data_of_interest = f[data_of_interest_reference] 

Причина, по которой это работает для вложенных данных: если вы посмотрите на тип набора данных, который хотите получить на более глубоком уровне, он говорит « h5py.h5r.Reference ». Чтобы действительно получить данные, на которые ссылаются ссылки, вам необходимо предоставить ссылку на объект файла .

Я знаю, что это старый вопрос. Но я нашел пакет, чтобы поцарапать этот зуд:

hdf5storage

Он может быть установлен pip и отлично работает на python 3.6 для файлов pre-post 7.3 и matlab. Для старых файлов он вызывает scipy.io.loadmat соответствии с документами.

  • 2D-свертка в Python, аналогичная conv2 Matlab
  • Пропорциональная диаграмма Венна для более чем трех наборов
  • Как преобразовать тональную дорожку из алгоритма извлечения мелодии в гудящий звуковой сигнал
  • Горизонтальное масштабирование ноутбука Ipython
  • SciPy интерполяция большой матрицы
  • Что такое эквивалент python / numpy num2cell ()?
  • «Клонирование» строк или столбцов векторов
  • Цветная 3D-поверхность на основе категорий, проходящих через точки разброса
  • Python - лучший язык программирования в мире.