h5py读取.mat文件中的每一个数据

为什么要用到h5py

如果待读取的.mat文件是用matlab v7.3格式保存的,用scio.loadmat()读就会报错,然后就会建议改用h5py去读。
一般来说先用scio.loadmat()试试,报错了再换成h5py就行。

我在用h5py读文件时遇到的问题

最基本的读取文件获取keys这些是很顺利地,跟着网上别人发的例子来看就行,没遇到什么问题。

import h5py
filename = ('filename.mat')
all_data = h5py.File(filename,'r')
luck = all_data['data_required']

然后如果要打印luck,得到的就是一个全为HDF5 object reference的序列,就算debug也看不到数据。

一些解决不了的方法

网上很多方法都是让直接用

luck = all_data['data_required'].value

来获取,但是会报错,说什么没有.value这个函数。有人说把h5py改成2.9版本就行了,我试了是不太行。

解决方法记录

搞了很久之后总算试出来了
这里很大的一个难点就是对于刚接触的人来说根本不知道hdf5是个什么样的保存格式,也就无从下手了。我也只是尝试出来了怎么得到数据,对于其内部保存方法等没有深究。
直接上代码:

for i in range(len(all_data[1])):
    for j in range(len(np.transpose(all_data[(luck[0][0])][0]))):
        for k in range(len(np.transpose(all_data[(luck[0][i])])[j])):
            data[i,j,k] = np.transpose(all_data[(luck[0][i])])[j][k]

假设.mat文件里保存的是(a * b * c)的数据,则上面的data[i,j,k]就对应了原.mat文件里的下标为[i,j,k]的数据。

下面是一些为了提高代码可读性的记录,供自己未来参考:
1、做transpose是因为用h5py读文件就会默认给转置一下,所以要转回去
2、all_data[(luck[0][i])]表示了a * b * c 里的 a (i from 0 to a-1 ),也就是说,每一个都表示了一个c * b大小的矩阵
3、(all_data[(luck[0][i])])[j]表示了每个a里的b(transpose之后就变成了c,外面再加一个[k]就会变成另一个)

就写这些吧,命名为luck是因为在成功看到数据那一刻真的只希望未来一切顺利,好运环绕,希望自己下次能很快就看懂吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值