Как импортировать файл.mat-v7.3 используя h5py

У меня есть.mat файл, который имеет 3 матрицы A, B, C.

На самом деле я использовал scipy.io для импорта этого файла, как показано ниже.

data = sio.loadmat('/data.mat')
A = data['A']
B = data['B']
C = data['C']

Но файл v7.3 не может импортироваться таким образом. Итак, я попытался импортировать с использованием h5py, но я не знаю, как использовать h5py. Мой код, как показано ниже.

f = h5py.File('/data.mat', 'r')
A = f.get('/A')
A = np.array('A')

Какая часть не так? Спасибо!

1 ответ

В октаве

>> A = [1,2,3;4,5,6];
>> B = [1,2,3,4];
>> save -hdf5 abc.h5 A B

В ипифоне

In [138]: import h5py
In [139]: f = h5py.File('abc.h5')
In [140]: list(f.keys())
Out[140]: ['A', 'B']
In [141]: list(f['A'].keys())
Out[141]: ['type', 'value']
In [142]: f['A']['value']
Out[142]: <HDF5 dataset "value": shape (3, 2), type "<f8">
In [143]: A = f['A']['value'][:]
In [144]: A
Out[144]: 
array([[ 1.,  4.],
       [ 2.,  5.],
       [ 3.,  6.]])

Смотрите также ссылки на боковой панели.

По сути, это вопрос поиска нужного набора данных, а затем его загрузки, как описано в http://docs.h5py.org/en/latest/high/dataset.html.

https://pypi.python.org/pypi/hdf5storage/0.1.14 - этот пакет имеет MATLAB MAT v7.3 file support, Я еще не использовал это.


In [550]: import hdf5storage
In [560]: bar = hdf5storage.read(filename='abc.h5')
In [561]: bar
Out[561]: 
array([ ([(b'matrix', [[ 1.,  4.], [ 2.,  5.], [ 3.,  6.]])], [(b'matrix', [[ 1.], [ 2.], [ 3.], [ 4.]])])],
      dtype=[('A', [('type', 'S7'), ('value', '<f8', (3, 2))], (1,)), ('B', [('type', 'S7'), ('value', '<f8', (4, 1))], (1,))])

Таким образом, файл был загружен в виде структурированного массива с полями shape (1,) и 2, "A" и "B" (два имени переменных). Каждый в свою очередь имеет поля "тип" и "значение".

In [565]: bar['A']['value']
Out[565]: 
array([[[[ 1.,  4.],
         [ 2.,  5.],
         [ 3.,  6.]]]])

Или используя его loadmat:

In [570]: out = hdf5storage.loadmat('abc.h5',appendmat=False)
In [571]: out
Out[571]: 
{'A': array([(b'matrix', [[ 1.,  4.], [ 2.,  5.], [ 3.,  6.]])],
       dtype=[('type', 'S7'), ('value', '<f8', (3, 2))]),
 'B': array([(b'matrix', [[ 1.], [ 2.], [ 3.], [ 4.]])],
       dtype=[('type', 'S7'), ('value', '<f8', (4, 1))])}

out это словарь:

In [572]: out['B']['value']
Out[572]: 
array([[[ 1.],
        [ 2.],
        [ 3.],
        [ 4.]]])

Для чтения простого файла MATLAB это не добавляет много. Это может добавить больше с клетками или структурами. Но для написания MATLAB-совместимого файла это должно быть большим подспорьем (хотя для написания можно придерживаться scipy.io.savemat).

Другие вопросы по тегам