0
点赞
收藏
分享

微信扫一扫

学习笔记191—Python 从 mat 文件读写 到 h5py 文件包

谁知我新 2022-09-15 阅读 172

采用 Python 读取 matlab 中 .mat文件的方法有很多,中外文的论坛上都不少,相关博文,比如:

【摘要】

scipy.io文件,但,针对大文件(有网友睁着直径为8848米的小眼睛说的大小的分界点在2GB)以及存储版本在“matlab-v7.3”以上的文件就拙计了,这里分享一种刚刚学到处理方式,用h5py模块,详细介绍以及Python源码详见本文。

 【正文】

 1、如果你的matlab的版本比较旧,保存的.mat 格式为‘-v7.3’以前的版本,可以采用:scipy.io即可。假如有一个name_box.mat,其中,box: {1x29992 cell}和name: {1x29992 cell}。我们想要读取其中的box的内容,源码如下:

  1. import scipy.io as sio
  2. boxes = sio.loadmat(’name_box.mat‘)['box'].ravel()

这样boxes就是一个list,可以采用boxes[i]显示每个array的内容了,boxes.shape[0]为cell的个数

2、如果你的matlab的版本比较新,保存的.mat格式为‘-v7.3’的版本,由于scipy.io不支持,所以要采用hdf5,arr.mat是一个m*n的矩阵文件,代码准备先对arr读入,再对 TrainSet_rotate.h5文件实现写入操作,源码如下:

import h5py

import numpy as np

file = h5py.File('F:\\wfpdm\\20150702_2105\\arr.mat','r')

arr = file['arr'][:]

# h5py 用于文件读写 详细用例

data = np.array( [222,333,444] )

label = np.array( [0,1,0] )

img_num = np.array( [0,1,2] )

# 创建HDF5文件

file = h5py.File('TrainSet_rotate.h5','w')

# 写入

file.create_dataset('train_set_x', data = data)

file.create_dataset('train_set_y', data = label)

file.create_dataset('train_set_num',data = img_num)

file.close()

# 读方式打开文件

file=h5py.File('TrainSet_rotate.h5','r')

# 尽管后面有 '[:]', 但是矩阵怎么进去的就是怎么出来的,不会被拉长(matlab后遗症)

train_set_data = file['train_set_x'][:]

train_set_y = file['train_set_y'][:]

train_set_img_num = file['train_set_num'][:]

因此可见:​​Python 从 mat 文件的读写和存储 到 h5py 文件包​​。但是,在读取matlab文件的时候,往往不是一层 .mat 就足以解决问题的,.mat 文件中可能是存放的 cell(100*200) 数据, cell(100*200)数据中又分为多个 cell 。那么,如何处理这样的数据结构,实现Python对matlab这一类型数据的读取呢,现对该问题,详解如下:

【问题一】

matlab之中有FEAT_Name.mat文件,该文件的形式如下

FEAT_Name.mat <1x10>——>each element is<600x5755>

先要实现对FEAT_Name元组的首个矩阵的读取操作,代码实现如下

import h5py
myfile=h5py.File('F:\\wfpdm\\20150702_2105\\FEAT_Name.mat','r')
data = [myfile[element[0]][:] for element in myfile['FEAT_Name']]
print data[1].shape
Out: (5755,600)

解析

1)for element in myfile['FEAT_Name'] 实现了对 myfile['FEAT_Name']  的 cell 的遍历;

2)myfile[element[0]]恰好可以理解为myfile[element],即当前文件的当前cell;

3)[myfile[element[0]][:] for element in myfile['FEAT_Name']],实现了将数据以list结构存入data之中;

4)数据转置了600x5755变成了5755x600,需要实现再转置操作;

【问题二】

matlab之中有f.mat文件,该文件的形式如下

><1x454>>is<53x50>.mat ><1x454>>is<53x50>

先要实现对rank元组的首个矩阵的操作,代码实现如下

import h5py
f = h5py.File("f.mat")
data = [f[element[0]][:] for element in f['rank']]

result:

In : data[0].shape
Out: (50L, 53L)

In : data[1].shape
Out: (50L, 53L)

解析

这里只是多一步,将matlab数据的 cell.name 写入即可。至此,Python读取matlab的数据方法介绍完毕。

【复盘】

确实存在转置,只是一般的array结构的 .mat 文件不存在,但是针对cell结构的 .mat 文件 存在。需要进行再转置操作,还原数据。

详见:​​Python 从 mat 文件的读写和存储 到 h5py 文件包​​。

参考连接:​​http://www.voidcn.com/article/p-uicrnszv-vh.html​​

 

意在交流学习,欢迎点赞评论🙏, 如有谬误,请联系指正。转载请注明出处。


举报

相关推荐

0 条评论