Чтение массива ячеек 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 соответствии с документами.

  • Является ли MATLAB быстрее, чем Python?
  • Получите доступ к содержимому массива из файла .mat, загруженного с помощью Scipy.io.loadmat - python
  • Существует ли функция тяжелого шага?
  • MATLAB для программистов Python
  • Быстрый расчет логарифма
  • Пример обработки изображений MCMC в Matlab или Python
  • Дата и время Python для данных в Matlab
  • Представление и решение лабиринта с учетом изображения
  • Эквивалент csaps и ppval в python
  • Может ли функция Python возвращать только второе из двух значений?
  • Сценарий истории Интернета для Google Chrome
  •  
    Interesting Posts for Van-Lav

    Каковы точные недостатки copy = False в DataFrame.merge ()?

    enumerate () – генератор в Python

    Каков наилучший (идиоматический) способ проверки типа переменной Python?

    Скрыть приложение с экрана, но не с панели задач

    Использование plotly в Jupyter для создания анимированной диаграммы в автономном режиме

    Разбор html-данных в список python для манипуляции

    Обработка ошибок Переменные в программе калькулятора, номера обработки ошибок в порядке

    Заполните имя пользователя и пароль, используя selenium в python

    Поиск отсортированного списка?

    «Ошибка импорта: динамический модуль не определяет функцию init (init_mysql)», импортируя MySQLdb в OS X

    Разрешение отклонено другим приложением после makedirs ()

    Как использовать декоратор user_passes_test в представлениях на основе классов?

    Странное загрязнение пространства имен при импорте подмодуля в пакет __init__.py

    Большое количество подзаголовков с matplotlib

    Можно ли исправить допустимый YAML с привязками / ссылками, отключенными с помощью Ruby или Python?

    Python - лучший язык программирования в мире.