使用 h5py 读取 matlab .mat 文件

     2023-03-11     79

关键词:

【中文标题】使用 h5py 读取 matlab .mat 文件【英文标题】:Read a matlab .mat file using h5py 【发布时间】:2021-02-23 04:19:55 【问题描述】:

我想使用 Python3 包 h5py 读取 7.3 版本的 matlab .mat 文件。

它包含一个matlab中的变量,名为results

里面包含一个1*1的cell,里面struct里面的值就是我需要的。

在matlab中,我可以通过以下代码获取这些数据:

load('.mat PATH');
results1.res

我应该如何在 h5py 中读取这些数据? 示例.mat文件可以从here获取

【问题讨论】:

【参考方案1】:

虽然 h5py 可以从 MATLAB 读取 h5 文件,但要弄清楚其中的内容需要一些探索 - 查看 keys groupsdatasets(可能还有 attr)。 scipy 中没有任何内容可以帮助您(scipy.io.loadmat 用于旧的 MATLAB mat 格式)。

使用下载的文件:

In [61]: f = h5py.File('Downloads/Basketball_ECO_HC.mat','r')
In [62]: f
Out[62]: <HDF5 file "Basketball_ECO_HC.mat" (mode r)>
In [63]: f.keys()
Out[63]: <KeysViewHDF5 ['#refs#', 'results']>
In [65]: f['results']
Out[65]: <HDF5 dataset "results": shape (1, 1), type "|O">
In [66]: arr = f['results'][:]
In [67]: arr
Out[67]: array([[<HDF5 object reference>]], dtype=object)
In [68]: arr.item()
Out[68]: <HDF5 object reference>

我必须检查h5py 文档,看看是否可以进一步检查该对象引用。我不熟悉。

但探索其他key

In [69]: list(f.keys())[0]
Out[69]: '#refs#'
In [70]: f[list(f.keys())[0]]
Out[70]: <HDF5 group "/#refs#" (2 members)>
In [71]: f[list(f.keys())[0]].keys()
Out[71]: <KeysViewHDF5 ['a', 'b']>
In [72]: f[list(f.keys())[0]]['a']
Out[72]: <HDF5 dataset "a": shape (2,), type "<u8">
In [73]: _[:]
Out[73]: array([0, 0], dtype=uint64)
In [74]: f[list(f.keys())[0]]['b']
Out[74]: <HDF5 group "/#refs#/b" (7 members)>
In [75]: f[list(f.keys())[0]]['b'].keys()
Out[75]: <KeysViewHDF5 ['annoBegin', 'fps', 'fps_no_ftr', 'len', 'res', 'startFrame', 'type']>
In [76]: f[list(f.keys())[0]]['b']['fps']
Out[76]: <HDF5 dataset "fps": shape (1, 1), type "<f8">
In [77]: f[list(f.keys())[0]]['b']['fps'][:]
Out[77]: array([[22.36617883]])

在 OS shell 中,我可以使用h5dump 查看文件。由此看来,res 数据集的数据最多。数据集也有属性。这可能是获得概览的更好方法,并使用它来指导 h5py 加载。

In [80]: f[list(f.keys())[0]]['b']['res'][:]
Out[80]: 
array([[198., 196., 195., ..., 330., 328., 326.],
       [214., 214., 216., ..., 197., 196., 192.],
       [ 34.,  34.,  34., ...,  34.,  34.,  34.],
       [ 81.,  81.,  81., ...,  81.,  80.,  80.]])
In [81]: f[list(f.keys())[0]]['b']['res'][:].shape
Out[81]: (4, 725)
In [82]: f[list(f.keys())[0]]['b']['res'][:].dtype
Out[82]: dtype('<f8')

【讨论】:

【参考方案2】:

如果您的问题一般是询问如何在 Python 中读取使用 v7.3 保存的 matfile,hdf5storage 包提供了一些可能对您有用的实用程序。对于您的文件(安装软件包后),您将运行

In [0]: import hdf5storage as hdf5
In [1]: pyIn = LoadMatFile('Basketball_ECO_HC.mat')
In [2]: type(pyIn)                                                                                                                                             
Out[2]: dict
In [3]: pyIn.keys()                                                                                                                                             
Out[3]: dict_keys(['results'])
In [4]: type(pyIn['results'])                                                                                                                                   
Out[4]: numpy.ndarray
In [5]: pyIn['results'].shape                                                                                                                                   
Out[5]: (1, 1)
In [6]: pyIn['results'].dtype                                                                                                                                   
Out[6]: dtype('O')
In [7]: pyIn['results'][0,0].dtype                                                                                                                              
Out[7]: dtype([('type', '<U4', (1, 1)), ('res', '<f8', (725, 4)), ('fps', '<f8', (1, 1)), ('fps_no_ftr', '<f8', (1, 1)), ('len', '<f8', (1, 1)), ('annoBegin', '<f8', (1, 1)), ('startFrame', '<f8', (1, 1))])

您可以看到它在解析输入数组方面做得很好,尽管它可以将您在 Matlab 中使用 results11 访问的单元格中的单元格折叠成您使用 @ 访问的二维 numpy 数组987654324@ 代替。我遇到的另一个奇怪的事情是在更深的结构字段中添加了一个维度,如下所示:

In [8]: pyIn['results'][0,0]['res'].shape                                                                                        
Out[8]: (1, 725, 4)
In [9]: pyIn['results'][0,0]['res'][0,0,:]                                                                                                                      
Out[9]: array([198., 214.,  34.,  81.])

不完全确定为什么会发生这种情况,但总的来说应该可以正常工作。

也就是说,我确实遇到了这个软件包的最新版本 (0.2) 的问题,对于真正深的数组/单元格/结构组合,它变​​得异常缓慢。好消息是该软件包仍在维护中,因此可能正在对此进行修复。尽管如此,这促使我为 matfiles 编写自己的 h5py 阅读器,这在这些情况下更快,我将作为另一个答案讨论它。

【讨论】:

【参考方案3】:

正如我在关于 hd5fstorage 包的另一篇文章中提到的,我遇到了加载深度数组时速度太慢的问题。所以我实现了my own matfile loader,如果您关心如何将 v7.3 matfile 读入 Python 工作的细节,它的代码也可能更有用(因为它很紧凑)。 (也就是说,代码目前只有很少的 cmets,所以可能没那么有用。)

对于我的库,输出与hdf5storage 非常相似,如下所示。

In [0]: from MatFileMethods import LoadMatFile
In [1]: pyIn = LoadMatFile('/Users/emilio/Downloads/Basketball_ECO_HC.mat')
In [2]: type(pyIn)
Out[2]: dict
In [3]: pyIn.keys()
Out[3]: dict_keys(['results'])
In [4]: type(pyIn['results'])
Out[4]: numpy.ndarray
In [5]: pyIn['results'].shape
Out[5]: (1, 1)

请注意,与hdf5storage 包一样,Matlab 中使用results11 调用的cell-within-a-cell 变成了使用pyIn['results'][0,0] 调用的二维numpy.ndarray,如下所示。

In [6]: type(pyIn['results'][0,0])
Out[6]: dict
In [7]: pyIn['results'][0,0].keys()
Out[7]: dict_keys(['annoBegin', 'fps', 'fps_no_ftr', 'len', 'res', 'startFrame', 'type'])
In [8]: pyIn['results'][0,0]['res'].shape
Out[8]: (725, 4)
In [9]: pyIn['results'][0,0]['res'][0,:]
Out[9]: array([198., 214.,  34.,  81.])

hdf5storage 相比,我选择将Matlab 结构制作成Python dicts,这样结构的字段就是字典的键。

在任何情况下,这个模块都没有经过全面测试,但对于加载 ~500Mb 和 hdf5storage 版本 0.2 似乎无法处理的更大 mat 文件(我的自己的装载机与hdf5storage 的 >10 分钟加载时间(它在 10 分钟时还没有完成加载))。 (我会注意到,与 Matlab 自己的

【讨论】:

如何通过 h5py 读取 v7.3 mat 文件?

】如何通过h5py读取v7.3mat文件?【英文标题】:Howtoreadav7.3matfileviah5py?【发布时间】:2013-10-1902:25:29【问题描述】:我有一个由matlab创建并存储在v7.3格式mat文件中的结构数组:struArray=struct(\'name\',\'one\',\'two\',\'three\',\'id\',1,2,3,\'dat... 查看详情

python读取mat(v7.3)文件中的cell以及struct

...;""CreatedonSunNov2916:40:182020本工具主要用于mat文件的读取(matlab-v7.3格式)主要分为3个部分:1常规mat中的变量        2mat文件中的cell内部数据读取        3mat文件中... 查看详情

python写入和读取h5、pkl、mat文件

参考技术Apython中使用h5py对HDF5文件进行操作。1、创建文件和数据集importh5pyimportnumpyasnpimgData=np.zeros((2,4))f=h5py.File('HDF5_FILE.h5','w')#创建一个h5文件,文件指针是ff['data']=imgData#将数据写入文件的主键data下面f['labe... 查看详情

Matlab API 从 C++ 读取 .mat 文件,使用 STL 容器

】MatlabAPI从C++读取.mat文件,使用STL容器【英文标题】:MatlabAPIreading.matfilefromc++,usingSTLcontainer【发布时间】:2014-12-0119:14:00【问题描述】:我必须从c++中读取一些.mat数据文件,我通读了文档,但我想知道如何以干净优雅的方式处... 查看详情

在 R 中使用 foreach 循环读取 MATLAB .mat 文件时出现问题

】在R中使用foreach循环读取MATLAB.mat文件时出现问题【英文标题】:ProblemsreadingMATLAB.matfileswithaforeachloopinR【发布时间】:2016-11-1010:24:41【问题描述】:我有一千多个matlab文件要读入R。我使用R.matlab包来读取它们,我想并行操作。... 查看详情

matlab使用键值数据读取和分析mat文件

...排序。此示例假定MAT文件中的数据适合内存。mapredout.mat使用函数从示例文件创建数据存储datastore。示例文件包含表示航空公司承运人代码的唯一键和表示该承运人运营的航班数量的相应值。ds=datastore(\'mapredout.mat\');datastore返回一... 查看详情

如何使用 MAC OS MATLAB 读取在 windows MATLAB 中创建的 .mat 文件

】如何使用MACOSMATLAB读取在windowsMATLAB中创建的.mat文件【英文标题】:Howtoread.matfilescreatedinwindowsMATLABusingMACOSMATLAB【发布时间】:2015-05-2306:08:33【问题描述】:我有一堆使用MATLAB7.10.0R2010a在PC(Windows8.1)上创建的.mat文件。我正在... 查看详情

有没有办法在 Perl 中读取 MATLAB .mat 文件?

...:18:40【问题描述】:我有一些在MATLAB中生成的数据,我想使用Perl进行处理。我将MATLAB中的数据保存在.mat文件中。有什么办法可以在Perl中阅读它吗?【问题讨论】:【参考方案1】:一种选择是从MATLAB内部将二进制MAT文件 查看详情

用C读取matlab的mat文件

...'smatfileinC【发布时间】:2012-11-0913:18:59【问题描述】:我使用以下mex代码从C中的mat文件中获取一个变量。变量名称是“T”,它是一个3D矩阵。然后在matlab中,我将mex的输出分配给一个matlab变量和所有很好。“T”的大小是恒定的... 查看详情

Pandas 无法读取使用 h5py 创建的 hdf5 文件

】Pandas无法读取使用h5py创建的hdf5文件【英文标题】:Pandascan\'treadhdf5filecreatedwithh5py【发布时间】:2018-12-1021:38:13【问题描述】:当我尝试读取使用h5py创建的HDF5格式文件时出现pandas错误。我想知道我是不是做错了什么?importh5pyi... 查看详情

Pandas 无法读取使用 h5py 创建的 hdf5 文件

】Pandas无法读取使用h5py创建的hdf5文件【英文标题】:Pandascan\'treadhdf5filecreatedwithh5py【发布时间】:2016-02-1123:52:42【问题描述】:当我尝试读取使用h5py创建的HDF5格式文件时出现pandas错误。我想知道我是不是做错了什么?importh5pyi... 查看详情

如何使用 h5py 读取只有数据集(无组)的 HDF5 文件?

】如何使用h5py读取只有数据集(无组)的HDF5文件?【英文标题】:HowtoreadHDF5filesthathaveonlydatasets(nogroups)usingh5py?【发布时间】:2015-04-1708:05:07【问题描述】:我有想要使用Python模块h5py(在Python2.7中)打开的HDF5文件。当我有一个... 查看详情

matlab中如何建立一个mat文件

...数据保存在mydata.dat文件中了。2、mat文件的读取在matlab中使用load语句读取mat文件。(1)x1.mat文件和代码在同一个文件目录下。loadx1,y,a,b,c…;(2)x1.mat文件和代码不在同一个文件目录下。load([‘目录\x1.mat’])matlabtxt转mat文件txt转mat... 查看详情

matlab中mat文件的生成和读取

1、mat文件的生成(1)直接在Matlab中创建并保存矩阵数据  打开Matlab软件,点击左上角文件(File),然后点击新建(new),选择变量(Variable),就新建了一个mat文件。  点击你新建的文件,即可打开一个编辑器,输入数据... 查看详情

如何使用 Python 和 h5py 读取 HDF5 属性(元数据)

】如何使用Python和h5py读取HDF5属性(元数据)【英文标题】:HowtoreadHDF5attributes(metadata)withPythonandh5py【发布时间】:2021-05-1417:23:16【问题描述】:我有一个HDF5文件,里面有多个文件夹。每个文件夹都添加了属性(一些调用属性“... 查看详情

python读取mat文件-转csv文件(代码片段)

这篇教程主要介绍如何使用Python读取mat文件并且转csv文件。一、读取mat文件和转CSV首先将MATLAB生成的mat文件存储在一个目录下importpandasaspdimportscipyfromscipyimportioimportos#遍历文件夹fordirname,_,filenamesinos.walk('./data'):forfilenameinfile... 查看详情

使用 h5py 从 h5 文件中的同一组中读取多个数据集

】使用h5py从h5文件中的同一组中读取多个数据集【英文标题】:ReadmultipledatasetsfromsameGroupinh5fileusingh5py【发布时间】:2019-10-0416:50:26【问题描述】:我的h5文件中有几个组:\'group1\',\'group2\',...,每个组有3个不同的数据集:\'dataset... 查看详情

matlab中如何读取mat文件的矩阵

matlab中如何读取mat文件的矩阵1、生成MAT文件假如你的矩阵A、B都已赋值,现在需要将A、B矩阵保存成mat格式文件,执行如下命令:savematfile1AB就会把AB矩阵数据保存在matfile1.mat文件中了eg:>>A=[12];>>B=[34];>>savematfile1AB;%... 查看详情