解决:将.mat文件保存到.txt不带有科学计数法e-0
Python 2.7
IDE Pycharm 5.0.3
Matlab 2014a
遇到问题
在进行数据处理的时候,比如说我正好遇到KNN算法的python描述,但我的数据集是matlab的.mat文件,我想要用python处理数据的话,mat是不可行的,那怎么办呢?
需要转化的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') #保存的是数据
转换好之后就是这样的。
转为成txt后数据清洗
大家也看到,为了保存数据完整度,这里有科学计数法,但是写到txt之后效果就变了,都是字符串了,所以,开始数据清洗
核心代码
#清洗数据
line = line.strip()
line = re.sub('e-01',' ',line) #把e-01去掉
line = re.sub(' +',' ',line)
listFromLine = line.split(' ')
目的是,将e-01替换成空格,然后将多空格替换为一个空格,然后再进行对空格分割。这里耍了个小机灵,处理完了值后,应该就是可以下一步处理了,对Label的数据也相同处理方式,如下,只是把 点 作为分割对象了,记得正则表达式的转义符,使用\.
#清洗数据
line = line.strip()
line = re.sub('\.',' ',line) #把e+00去掉
line = re.sub(' +',' ',line)
listFromLine = line.split(' ')
但是。这有个严重的BUG!导致我后续的分类精度差的离谱!!!因为我竟然傻乎乎的以为所以得数据都是e-01和e+00结尾的,其实不是的!!这个我大意了,数据之间差十倍也是有的,比如说有数据是e-02的!,还有类别是11的,如果直接以'.'为分隔符的话,第10类和第1类就一样了!!!,所以,这种方法对于这类数据来说,失败!
2.采用.mat先写入excel之后,用excel另存为txt!
具体的语句是这样的,我以IM.mat为例
>> data_label =IM(:,:) # 先是选择要写入的行列,这里为全选
>> xlswrite('F:\label.xls',data) #第一项为保存的文件,第二项为数据
注意点:需要先新建excel,不然会无权写入报错
之后的数据大概是这样的.OK没有讨厌的科学计数法!!
之后点击另存为txt就可以了
注意!选择保存类型为文本制表符txt!!!!,不然将会在后续操作中报错!
之后的样式就是这样,非常标准的制表符形式的txt文件,之后的数据清洗和数据分析很有帮助!
转化后的txt
总结
相比较方法一,方法二完胜,就是多了一步excel的保存操作,但是这么简单的想法我却花了半天才想到,刚开始用format long之后,想把小数点全部读完然后写到txt,但是失败,之后又用num2str,mat2str想转变为字符串之后保存txt这样就没有科学计数法的困扰,也失败,还有也尝试用过fprintf函数,有点费时间,所以对于不怎么熟悉matlab的人来说,第二种方法实际可行,所以就酱紫把!
致谢
利用python进行数据分析.Wes McKinney著
机器学习实战.Peter Harrington著
@matlab论坛--怎样将matlab中的数据保存到.txt中?
@MrLevo520--(大)数据处理:从txt到数据可视化
@MrLevo520--numpy快速入门