首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用h5py在python中读取HDF5_5格式的MATLAB文件

用h5py在python中读取HDF5_5格式的MATLAB文件
EN

Stack Overflow用户
提问于 2016-12-08 09:17:18
回答 1查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
import h5py
data = h5py.File("Q_visSDF_accurate.mat", 'r')
sdf = data.get("sdf")[:,:]
sdf = sdf.astype(float)

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

代码语言:javascript
复制
filename = data.get("filename")[0]

但是代码会返回:

代码语言:javascript
复制
array([<HDF5 object reference>, <HDF5 object reference>,
   <HDF5 object reference>, ..., <HDF5 object reference>,
   <HDF5 object reference>, <HDF5 object reference>], dtype=object)

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

EN

回答 1

Stack Overflow用户

发布于 2017-03-30 01:06:50

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

代码语言:javascript
复制
>> 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

在带有h5pyipython中,我发现这个文件包含两个组

代码语言:javascript
复制
In [283]: F = h5py.File('../testmat.h5','r')
In [284]: list(F.keys())
Out[284]: ['xcell', 'xmat']

矩阵组具有typevalue数据集:

代码语言:javascript
复制
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.]])

该单元具有相同的typevalue,但value是另一组:

代码语言:javascript
复制
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数组:

代码语言:javascript
复制
In [301]: F['xcell']['value']['_0']['value'][...]
Out[301]: array(1.0)

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41030188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档