为什么要用到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是因为在成功看到数据那一刻真的只希望未来一切顺利,好运环绕,希望自己下次能很快就看懂吧。