解决:将.mat文件保存到.txt不带有科学计数法e-0

解决:将.mat文件保存到.txt不带有科学计数法e-0

Python 2.7 
IDE Pycharm 5.0.3 
Matlab 2014a


遇到问题

在进行数据处理的时候,比如说我正好遇到KNN算法的python描述,但我的数据集是matlab的.mat文件,我想要用python处理数据的话,mat是不可行的,那怎么办呢?

这里写图片描述


解决思路

python能读入的是txt,现在数据很多也是存在txt中的(以我接触的一些数据来说),python读取txt是非常方便的,而且读完构造array也好,list也好,都是十分方便的。所以我们目的就是把.mat文件转化成txt即可


解决方案

1.在matlab端采用命令 
实现转换代码

#这里是matlab的格式,不是python,先load数据,然后保存为txt格式
>> load('testAVIRIS.mat', 'IM')
>> save('testAVIRIS_Label.txt','CL','-ascii') #保存的是类
>> save('testAVIRIS.txt','testAVIRIS_IM','-ascii') #保存的是数据
  • 1
  • 2
  • 3
  • 4

转换好之后就是这样的。

这里写图片描述


数据清洗

大家也看到,为了保存数据完整度,这里有科学计数法,但是写到txt之后效果就变了,都是字符串了,所以,开始数据清洗 
核心代码

        #清洗数据
        line = line.strip()
        line = re.sub('e-01',' ',line) #把e-01去掉
        line = re.sub(' +',' ',line)
        listFromLine = line.split(' ')
  • 1
  • 2
  • 3
  • 4
  • 5

目的是,将e-01替换成空格,然后将多空格替换为一个空格,然后再进行对空格分割。这里耍了个小机灵,处理完了值后,应该就是可以下一步处理了,对Label的数据也相同处理方式,如下,只是把 点 作为分割对象了,记得正则表达式的转义符,使用\.

        #清洗数据
        line = line.strip()
        line = re.sub('\.',' ',line) #把e+00去掉
        line = re.sub(' +',' ',line)
        listFromLine = line.split(' ')
  • 1
  • 2
  • 3
  • 4
  • 5

但是。这有个严重的BUG!导致我后续的分类精度差的离谱!!!因为我竟然傻乎乎的以为所以得数据都是e-01和e+00结尾的,其实不是的!!这个我大意了,数据之间差十倍也是有的,比如说有数据是e-02的!,还有类别是11的,如果直接以’.’为分隔符的话,第10类和第1类就一样了!!!,所以,这种方法对于这类数据来说,失败!


2.采用.mat先写入excel之后,用excel另存为txt! 
具体的语句是这样的,我以IM.mat为例

    >> data_label =IM(:,:); # 先是选择要写入的行列,这里为全选
    >> xlswrite('label.xls',data_label) #第一项为保存的文件,第二项为数据
  • 1
  • 2

之后的数据大概是这样的.OK没有讨厌的科学计数法!!

这里写图片描述

之后点击另存为txt就可以了 
注意!选择保存类型为文本制表符txt!!!!,不然将会在后续操作中报错! 
这里写图片描述

之后的样式就是这样,非常标准的制表符形式的txt文件,之后的数据清洗和数据分析很有帮助!

这里写图片描述


更新

如遇以下问题

Error using xlswrite (line 219)
Error: 服务器出现意外情况。
  • 1
  • 2
  • 3

这是端口被占用的原因,多谢@偏爱小毛驴的解决方案关于MATLAB中xlswrite函数写数据出现服务器异常情况的解决办法


总结

相比较方法一,方法二完胜,就是多了一步excel的保存操作,但是这么简单的想法我却花了半天才想到,刚开始用format long之后,想把小数点全部读完然后写到txt,但是失败,之后又用num2str,mat2str想转变为字符串之后保存txt这样就没有科学计数法的困扰,也失败,还有也尝试用过fprintf函数,有点费时间,所以对于不怎么熟悉matlab的人来说,第二种方法实际可行,所以就酱紫把!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值