当前位置:   article > 正文

python 读取 mat 文件_sio.loadmat

sio.loadmat

详细参考: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')
  • 1

Save Python data structure to a MAT-file:

savemat('datafile.mat')
  • 1

下面的数据结构不支持:

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

使用手册: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']
  • 1
  • 2

使用手册: 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

方法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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

控制台输出:

<type 'dict'>
age,score,name,sex
[u'xlh', u'gyl']
  • 1
  • 2
  • 3

方法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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

控制台输出:

<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))]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/552492
推荐阅读
相关标签
  

闽ICP备14008679号