python如何处理matlab的mat数据

 更新时间:2022年05月11日 10:11:02   作者:amcomputer  
这篇文章主要介绍了python如何处理matlab的mat数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

处理matlab的mat数据

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的*.mat格式数据及常见错误汇总

由于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真的不行呀!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • Pytorch实现ResNet网络之Residual Block残差块

    Pytorch实现ResNet网络之Residual Block残差块

    这篇文章主要为大家介绍了Pytorch实现ResNet网络之Residual Block残差块实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Django框架中序列化和反序列化的例子

    Django框架中序列化和反序列化的例子

    今天小编就为大家分享一篇Django框架中序列化和反序列化的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python爬虫教程之利用正则表达式匹配网页内容

    Python爬虫教程之利用正则表达式匹配网页内容

    这篇文章主要给大家介绍了关于Python爬虫教程之利用正则表达式匹配网页内容的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • python判断一个集合是否包含了另外一个集合中所有项的方法

    python判断一个集合是否包含了另外一个集合中所有项的方法

    这篇文章主要介绍了python判断一个集合是否包含了另外一个集合中所有项的方法,涉及Python集合操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 对Python中创建进程的两种方式以及进程池详解

    对Python中创建进程的两种方式以及进程池详解

    今天小编就为大家分享一篇对Python中创建进程的两种方式以及进程池详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • django表单的Widgets使用详解

    django表单的Widgets使用详解

    这篇文章主要介绍了django表单的Widgets,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python中的随机数种子seed()用法说明

    python中的随机数种子seed()用法说明

    这篇文章主要介绍了python中的随机数种子seed()用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python如何生成随机高斯模糊图片详解

    Python如何生成随机高斯模糊图片详解

    这篇文章主要给大家介绍了关于高斯模糊的原理以及python实现的相关资料,Python使用opencv库生成模糊图像还是很方便的,需要的朋友可以参考下
    2021-05-05
  • python利用pd.cut()和pd.qcut()对数据进行分箱操作

    python利用pd.cut()和pd.qcut()对数据进行分箱操作

    本文主要介绍了python利用pd.cut()和pd.qcut()对数据进行分箱操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Python数据处理pandas读写操作IO工具CSV解析

    Python数据处理pandas读写操作IO工具CSV解析

    这篇文章主要为大家介绍了Python pandas数据读写操作IO工具之CSV使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论