Python处理matlab的mat数据过程是什么,错误如何解决
Admin 2022-09-09 群英技术资讯 497 次浏览
python 和matlab是2个常用的实验室平台工具,在一些应用下,这2个不同平台下的数据会打交道,因此如何读取和保存显得尤为重要,这里需要用到python的第三方平台下的scipy模块。
先用下面这个命令检查是否下载好scipy
import scipy
如果报错,用python install scipy 或者 conda install scipy 下载安装
需要用到scipy中的输入输出类中的loadmat 和savemat方法:
import scipy.io as sio sio.loadmat(file_name, mdict=None, appendmat=True, **kwargs) sio.savemat(file_name, mdict, appendmat=True, format='5', long_field_names=False, do_compression=False, oned_as='row'
下面介绍一个简单的错误例子:(需要传字典格式的参数)
import scipy.io as sio import numpy as np x = np.ones((3,3)) x Out[86]: array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]]) sio.savemat('f.mat',x) Traceback (most recent call last): File "<ipython-input-87-d739bc03c885>", line 1, in <module> sio.savemat('f.mat',x)
下面介绍一个简单的保存 导入例子:
import scipy.io as sio import numpy as np x = np.ones((3,3)) x Out[86]: array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]]) sio.savemat('f.mat',{"x":x}) myMat =sio.loadmat('f.mat') print(myMat) #输出为字典 {'__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Fri Aug 21 16:29:37 2020', '__version__': '1.0', '__globals__': [], 'x': array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])} #以保存名为key,输出list value print(myMat['x']) [[1. 1. 1.] [1. 1. 1.] [1. 1. 1.]]
如果想把python数据保存为mat数据,则需要cell格式数据,而python没有实现cell,因此需要用到numpy模块,可以看这篇博客。
由于matlab和python两种语言的编程方式不同,有时候在进行程序混编时,需要利用python调用matlab下的格式数据,下面介绍如何调用mat格式数据及常见错误解决方法,仅供参考!
# 最初用loadmat读取数据 import numpy as np from scipy.io mport loadmat img = loadmat('im.mat')['im'] #im.mat为mat数据的名称,['im'] 中的im表示该文件下im的数据
使用如上代码读取数据时,会出现如下错误:
如果出现以上错误,改用下面方式读取,
import h5py img = h5py.File('im.mat')['im'] img = h5py.File('im.mat','r')['im'] # 无警告
(用Python处理图像时,若涉及加减运算,溢出差值被重新赋值255-0)
# python代码 import h5py import numpy as np img = h5py.File('im.mat')['im'] # python中的M,N刚刚好与matlab中的M,N取值相反,此处进行转置与matlab相同矩阵格式进行处理 x = np.array(img).T [M, N] = x.shape if M < 16 and N < 16: score = -2 # Feature Extraction: # 1. horizontal features d_h = x[:, 1:N] - x[:, 0:N - 1] # 该步操作图像产生满溢,溢出后差值可能都被赋为255,依次递减
此种情况下,d_h数据会出现满溢情况,下面就是相同数据在python和matlab下面进行运算的差异性。
% Matlab 代码 img = laod('im.mat') [M, N] = size(x) if M < 16 | N < 16 score = -2; end x = double(img); % 将无符号类型uint8数据类型转换为double类型 % Feature Extraction: % 1. horizontal features d_h = x(:, 2:N) - x(:, 1:(N-1));
原因: 导入数据类型为 uint8 数据格式,该种格式下是没有负数的,在matlab中进行运算时,先将uint8数据类型转化为了double类型,然后进行了减法运算,所以会出现如上结果,但是在python中,由于没有double类型,所以需要自己手动设置数据格式类型,只需要改成不是uint8格式即可(具体格式需要根据需求,此处改成了int8格式类型)。解决方法非常简单,只需在上面的一行代码中加入数据类型即可:
x = np.array(img,dtype = 'int8').T # 对读取的uint8格式数据进行重新定义一下格式即可 x = np.array(img,dtype = 'float').T # 下面这种格式虽然是浮点型,但是计算过程不容易出错,如果是上面的int8会出现部分错误,需要注意
现在看一下结果,就跟matlab处理结果一样了。
虽然下面是浮点型,但是能够保证数据转化的精度和准确性,img的影像数据转化成数值时不出错误,非必要情况下,不要使用int8数据格式,因为使用int8格式数据类型,会在某些部分出错,这一定要注意。(改组数据中(0,80)数值在int8格式转化时出错,原始数值为129,转化之后变成127,而使用float格式则不会出现错误)
原始数据unit8数据格式类型的数值为129,在python中不同格式类型的值就不一样。
所以uint8格式,在python运算中还是转换成float格式靠谱,转换成int8真的不行呀!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了python中图像边缘检测算法的原理及实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Python编程中经常遇到一些莫名其妙的错误, 其实这不是语言本身的问题, 而是我们忽略了语言本身的一些特性导致的,今天就来看下使用Pyth
ModelForm类是form是组件中Form的一个子类,所以也是处理表单的,下面这篇文章主要给大家介绍了关于django中模板继承与ModelForm的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
这篇文章主要为大家介绍了Python进行密码学反向密码的教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列。它是 bytearray 的不可变版本。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008