Открытие файла мата с помощью h5py и преобразование данных в матрицу numpy

У меня есть файл мата, который содержит 2 разные ячейки, содержащие матрицы разного размера. Мне нужно преобразовать эти данные в массив numpy, используя h5py для эксперимента (я новичок в h5py. Я думал, что это так же просто, как объясняется здесь

Чтение файла работает хорошо, размещение данных в массиве numpy также работает хорошо, но мне нужно представление значения каждой позиции внутри каждой матрицы внутри каждой ячейки, принимая во внимание, что когда я печатаю, например, np.array(x[0][1]), я получаю только ссылку на array(< HDF5 object reference>, dtype=object) и мне нужны значения внутри него...

Выглядит очень заманчиво преобразовать ячейку в трехмерную матрицу в Matlab, однако я не считаю, что с правами root можно делать что-либо в Matlab, кроме чтения данных и выполнения вычислений (ничего не сохраняя).

Если кто-то уже работал над этим, или кто-то имеет представление о том, как получить эти данные, я готов выслушать ваши советы.


person Diego Alejandro Gómez Pardo    schedule 18.05.2016    source источник


Ответы (2)


Ищу matlab и h5py нахожу

прочитать файл Matlab v7.3 в список python массивов numpy через h5py (2014)

Чтение ячейки Matlab массив, сохраненный в виде файла .mat версии 7.3 с помощью H5py (2015 г.)

Как прочитать файл mat v7.3 через h5py? (2013)

Структуры и ячейки MATLAB не отображаются непосредственно на классы h5 или numpy. Так что есть тенденция встраивать их в массивы object. Эта проблема возникает и при чтении старых файлов .mat с помощью scipy.io.loadmat. Чтобы извлечь элемент из массива dtype=object, вы используете дополнительную индексацию, что для массивов 0d может быть немного сложным.

Позвольте мне проиллюстрировать

In [603]: a = np.arange(4)

Создайте массив 1d с 1 элементом и вставьте a

In [604]: b = np.array([None], dtype=object)
In [605]: b[0] = a

In [606]: b
Out[606]: array([array([0, 1, 2, 3])], dtype=object)

получить a с индексацией или item:

In [607]: b[0]
Out[607]: array([0, 1, 2, 3])

In [608]: b.item()
Out[608]: array([0, 1, 2, 3])

но если это массив 0d numpy:

In [618]: c=np.array(None)    
In [619]: c
Out[619]: array(None, dtype=object)
In [620]: c[()]=a

In [621]: c
Out[621]: array(array([0, 1, 2, 3]), dtype=object)

In [622]: c.item()
Out[622]: array([0, 1, 2, 3])

In [623]: c[()]
Out[623]: array([0, 1, 2, 3])

В этом случае вы должны индексировать пустой кортеж ().

person hpaulj    schedule 18.05.2016

Вы должны вызвать элемент следующим образом:

np.array(x)[0, 1]
person Francesco Nazzaro    schedule 18.05.2016