使用h5py在python中读取HDF5格式的MATLAB文件

时间:2016-12-08 01:17:18

标签: python matlab h5py

我正在尝试使用h5py库在python中读取HDF5格式的MATLAB文件。该文件名为“Q_visSDF_accurate.mat”,有两个键:“filename”和“sdf”。 “filename包含一个单元格数组字符串。”sdf“是一个包含浮点数的[6001,49380]矩阵。使用以下代码提取变量sdf没有问题:

import h5py
data = h5py.File("Q_visSDF_accurate.mat", 'r')
sdf = data.get("sdf")[:,:]
sdf = sdf.astype(float)

但是,我无法读取filename变量。我试过了:

filename = data.get("filename")[0]

但代码返回:

array([<HDF5 object reference>, <HDF5 object reference>,
   <HDF5 object reference>, ..., <HDF5 object reference>,
   <HDF5 object reference>, <HDF5 object reference>], dtype=object)

我可以取消引用filename变量的内容吗?使用hdf5storage包不是一个解决方案,因为它只适用于python 32位,只能读取matlab变量的子集。

1 个答案:

答案 0 :(得分:0)

在Octave中,我创建了一个包含单元格和矩阵的文件

>> xmat = [1,2,3;4,5,6;7,8,9];
>> xcell = {1,2,3;4,5,6;7,8,9};
>> save -hdf5 testmat.h5 xmat xcell

在使用ipython的{​​{1}}中,我发现此文件包含2个组

h5py

矩阵组有In [283]: F = h5py.File('../testmat.h5','r') In [284]: list(F.keys()) Out[284]: ['xcell', 'xmat'] type数据集:

value

该单元格具有相同的In [285]: F['xmat'] Out[285]: <HDF5 group "/xmat" (2 members)> In [286]: list(F['xmat'].keys()) Out[286]: ['type', 'value'] In [287]: F['xmat']['type'] Out[287]: <HDF5 dataset "type": shape (), type "|S7"> In [288]: F['xmat']['value'] Out[288]: <HDF5 dataset "value": shape (3, 3), type "<f8"> In [289]: F['xmat']['value'][:] Out[289]: array([[ 1., 4., 7.], [ 2., 5., 8.], [ 3., 6., 9.]]) type,但value是另一个群组:

value

我必须使用In [291]: F['xcell']['type'] Out[291]: <HDF5 dataset "type": shape (), type "|S5"> In [292]: F['xcell']['value'] Out[292]: <HDF5 group "/xcell/value" (10 members)> In [294]: list(F['xcell']['value'].keys()) Out[294]: ['_0', '_1', '_2', '_3', '_4', '_5', '_6', '_7', '_8', 'dims'] ... In [296]: F['xcell']['value']['dims'][:] Out[296]: array([3, 3]) 来获取单元格的值,因为它是一个0d数组:

[...]

要真正复制我应该创建字符串单元格值的问题,但我认为这很好地说明了单元格的存储方式 - 作为数据组中的命名数据集。

我假设Octave h5存储与MATLAB的兼容。