Python 之 h5py 读取 matlab 中 .mat 文件 cell 方法浅析

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

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

详址:http://blog.csdn.net/u013630349/article/details/47090299

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

【问题一】

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

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

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

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文件,该文件的形式如下

		 ——> rank <1x454 cell>		——> each element is <53x50 double>
   f.mat
		——> compare <1x454 cell>		——> each element is <53x50 double>

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

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://blog.csdn.net/u013630349/article/details/47090299

这是笔者第一次完完全全通过外文网站论坛实现问题突破,一直到现在,完成了小结这个知识点的时候还是很兴奋。继续码去了,KK~ !~

【参考】

http://stackoverflow.com/questions/27670149/read-matlab-v7-3-file-into-python-list-of-numpy-arrays-via-h5py

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-28 16:11:38

Python 之 h5py 读取 matlab 中 .mat 文件 cell 方法浅析的相关文章

利用Python读取Matlab的Mat文件内容

手头有别人写的Matlab程序,其中用到了Mat文件.现在不想安装Matlab,却又想读取Mat文件内容,该怎么办呢? 感谢scipy!!! 1 import scipy.io 2 3 data = scipy.io.loadmat('1.mat') # 假设文件名为1.mat 4 # data类型为dictionary 5 print data.keys() # 即可知道Mat文件中存在数据名,假设存在'x', 'y'两列数据 6 print data['x'] 7 print data['y

c/c++中读取和写入mat文件 --- MAT File I/O Library(二)

本篇记述c/c++中读取mat文件示例 测试数据matioTest.zip下载地址: http://pan.baidu.com/s/1sjPkMsd 1. 读取matioTest.zip中s.mat文件,数据为普通matrix 1 #include <iostream> 2 #include <cassert> 3 #include <matio.h> 4 5 6 int main() 7 { 8 mat_t *matfp; 9 const char* matFileP

matlab 中txt文件(含字符及数值)处理

matlab 中txt文件(含字符及数值)处理 (2008-08-02 09:45:12) 转载▼ 标签: 杂谈 分类: matlab及C学习 Matlab文件操作及读txt文件ZZ 2008-07-11 16:43 matlab文件操作文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件.MATLAB提供了一系列低层输入输出函数,专门用于文件操作.1.文件的打开与关闭1)打开文件在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式.fopen

不解压直接读取压缩包中的文件

最近做的一个Android项目中,需要将一个有20W份html文件的压缩包下载到本地,解压后在本地浏览:在解压的时候尝试了很多方法都无法完成解压(文件数量太大,要么解压超慢要么就内存溢出程序崩溃),后来放弃解压,直接从压缩包中读取文件,下面将方法整理如下 通过ZipFile.getEntry("文件名")方法获取来获取压缩包中的指定文件对象 public static void readZipFile(String file,String fileName) throws Except

工程中properties文件处理方法类

功能:properties文件加载.取得key对应的值 1 import java.util.ResourceBundle; 2 3 /** 4 * 工程中properties文件处理方法类 5 */ 6 public class ConfigHolder { 7 private static ResourceBundle bundle; 8 9 /** 10 * 加载properties文件 11 */ 12 private static void loadConfig() { 13 if(b

python读取文件——python读取和保存mat文件

首先我们谈谈MarkDown编辑器,我感觉些倒是挺方便的,因为用惯了LaTeX,对于MarkDown还是比较容易上手的,但是我发现,MarkDown中有这样几个问题一直没能找到具体的解决方法: 图片大小的问题.在LaTeX中我们可以调整图片的大小,以适应整个文本: 字体,字号大小的设置.在MarkDown里面标题倒是挺大的,但是正文却显得太小,不是很喜欢里面的字体. 主要发现上面两个问题导致编辑出来的文本挺难看. 一.mat文件 mat数据格式是Matlab的数据存储的标准格式.在Matlab中

【转】Java读取matlab的.mat数据文件

参考:Java读取mat文件 下载链接:ujmp  jmatio 下载完两个.jar文件之后,如何引用到java项目当中?项目名称->右键->Property->Java Build Path->Libraries->Add External JARs->选择那两个jar文件即可. 接下来在类中就可import类了.

matlab中 mat的文件和txt文件相互转换

(1)直接保存为txt文件: >> a=rand(1,2) a = 0.1419 0.4218 >> fid=fopen('a.txt','wt'); >> fprintf(fid,'%6.4f %6.4f\n',a); >> fclose(fid); >> (2)将mat文件转存为txt文件: >> clear >> load a.mat >> save b.txt -ASCII a; (3)将txt文件转存

matlab 生成mat文件

生成MAT文件 假如你的矩阵A.B都已赋值,现在需要将A,B矩阵保存成mat格式文件,执行如下命令:save mydata A B 就会把A B矩阵数据保存在yourdata.dat文件中了 保存指定数据为MAT文件:假如我们只想保存A矩阵,那么,我们可以用如下命令:save mydata2 A 回车 这样就可以将矩阵A单独保存起来了 保存所有数据为MAT文件:如果有多个矩阵,我们都需要将其保存,如果我们这样写,save mydata2 A B C D....这样写会很麻烦,我们直接用下面命令便