python 读取 mat 文件

详细参考:https://docs.scipy.org/doc/scipy/reference/tutorial/io.html

(1) mat4py库:

功能: 将Matlab 数据导入为基本的Python数据类型。矩阵是以行为组的存储方式(使用列表的列表)。 Matlab结构体Struct和元胞Cell 使用Python的词典表示。

Load data from MAT-file:

函数loadmat将存储在MAT-file中的变量加载为简单的Python数据结构,仅使用词典和列表对象。数值数组和cell数组 转换为以行为主的嵌套列表(lists)。压缩数组,消除只含有一个元素的数组。产生的数据结构由简单的类型组成,兼容JSON格式。

data = loadmat('datafile.mat')

Save Python data structure to a MAT-file:

savemat('datafile.mat')

下面的数据结构不支持:

  • 超过两维的数组
  • 复数数组
  • 稀疏数组
  • 函数数组
  • 对象类
  • 匿名函数类

使用手册:https://pypi.python.org/pypi/mat4py/0.4.0

(2) 使用 import scipy.io as sio

所有的元素都封装在ndarray 中。

data = sio.loadmat('train_data.mat');
data = data['data']

使用手册: https://docs.scipy.org/doc/scipy/reference/tutorial/io.html

测试:

结构体数组的生成。分析:list – cell, dict – struct

% 用来测试 sio.loadmat 和 mat4py.loadmat

student = repmat(struct('name',[],'age',[],'sex',[],'score',[]),2,1);

student(1).name = 'xlh';
student(1).age  = 22;
student(1).sex  = 'male';
student(1).score = [120,1;130,0;100,1];

student(2).name = 'gyl';
student(2).age  = 20;
student(2).sex  = 'female';
student(2).score = [111,0;150,2;140,0];

save('student.mat','student');
disp('save student.mat over ...');

方法1:利用 mat4.py访问.mat文件:

import mat4py

student1 = mat4py.loadmat('student.mat')

student1 = student1['student']

print type(student1)  #dict 

print ','.join(['%s' % key for key,val in student1.iteritems()]) # age,score,name,sex

name  = student1['name'] 
age   = student1['age']
sex   = student1['sex']
score = student1['score']

print name # name list

控制台输出:

<type 'dict'>
age,score,name,sex
[u'xlh', u'gyl']

方法2:利用sio访问.mat文件


import scipy.io as sio 
student2 = sio.loadmat('student.mat')
student2 = student2['student']

print type(student2) #numpy.ndarray 
print student2.shape #(2,1)  将结构体的每一行看作是一个数组
print '----------------'
name  = []
age   = []
sex   = []
score = []

for id1,va1 in enumerate(student2):
    va2 = va1[0]
    print 'type(va1)',type(va1)
    print 'type(va1[0])',type(va1[0])
    name.append(va2[0])
    age.append(va2[1])
    sex.append(va2[2])
    score.append(va2[3])

print '----------------'
print name
print '----------------'
print student2
print sex[0][0]

控制台输出:

<type 'numpy.ndarray'>
(2L, 1L)
----------------
type(va1) <type 'numpy.ndarray'>
type(va1[0]) <type 'numpy.void'>
type(va1) <type 'numpy.ndarray'>
type(va1[0]) <type 'numpy.void'>
----------------
[array([u'xlh'], 
      dtype='<U3'), array([u'gyl'], 
      dtype='<U3')]
----------------
[[ (array([u'xlh'], 
      dtype='<U3'), array([[22]], dtype=uint8), array([u'male'], 
      dtype='<U4'), array([[120,   1],
       [130,   0],
       [100,   1]], dtype=uint8))]
 [ (array([u'gyl'], 
      dtype='<U3'), array([[20]], dtype=uint8), array([u'female'], 
      dtype='<U6'), array([[111,   0],
       [150,   2],
       [140,   0]], dtype=uint8))]]

mat4.py 不能处理带有汉字的mat文件。例如将上面的性别’male’改成’男’,则会报错。sio 感觉用起来麻烦。

  • 14
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值