python的数据与matlab互通问题:SciPy

 更新时间:2022年12月15日 08:53:40   作者:后厂村路蔡徐坤  
这篇文章主要介绍了python的数据与matlab互通问题SciPy,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

python数据与matlab互通SciPy

有时候需要利用python进行科学计算,但需要Matlab进行交互式画图,因此需要掌握python与matlab数据互通的技巧:SciPy

  • SciPy 提供了与 Matlab 的交互的方法。
  • SciPy 的 scipy.io 模块提供了很多函数来处理 Matlab 的数组。

python利用scipy.io.savemat()存储日志

参考:https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.savemat.html

(一)语法

scipy.io.savemat(file_name, mdict, appendmat = True, format = '5', long_field_names = False, do_compression = False, oned_as = 'row')
参数
file_name:str
      .mat 文件的名称(如果没有扩展名,需要设置appendmat == True)
mdict:dict
      从中保存 matfile 变量的字典。
appendmat:布尔值,可选
      True(默认值)将 .mat 扩展名附加到给定文件名的末尾(如果尚不存在)。
fomat:{'5', '4'},字符串,可选
      '5'(默认值)用于 MATLAB 5 及更高版本(至 7.2),'4' 用于 MATLAB 4 .mat 文件。
long_field_names:布尔型,可选
      False(默认值)- 结构中的最大字段名称长度为 31 个字符,这是记录的最大长度。True - 结构中的最大字段名称长度为 63 个字符,适用于 MATLAB 7.6+。
do_compression:布尔值,可选
      是否在写入时压缩矩阵。默认为假。
oned_as :{'row', 'column'},可选
      如果是 'column',则将一维 NumPy 数组写为列向量。如果为“行”,则将一维 NumPy 数组写为行向量。

(二)例子

from scipy import io
import numpy as np
arr = np.arange(10)

io.savemat('arr.mat', {"vec": arr})
#如果存入多组数据
io.savemat('saveddata.mat', {'xi': xi,'yi': yi,'ui': ui,'vi': vi})

利用matlab读取mat日志的方法

(一)载入日志文件

mat_struct=load('C:\Users\XXX\Desktop\task3-2022y01m23d-17h52m.mat');

(二)取出元素

mat_struct=load('C:\Users\XXX\Desktop\task3-2022y01m23d-17h52m.mat');
ans=mat_struct.ans;
select_info=mat_struct.select_info;
select_info_p=mat_struct.select_info_p;
clear mat_struct;

Python数据分析scipy

SciPy是一组专门解决科学计算中各种标准问题域的包的集合,主要包括下面这些包:

  • scipy.integrate:数值积分例程和微分方程求解器
  • scipy.linalg:扩展了由numpy.linalg提供的线性代数例程和矩阵分解功能
  • scipy.optimize:函数优化器(最小化器)以及跟查找算法
  • scipy.signal:信号处理工具
  • scipy.sparse:稀疏矩阵和系数线性系统求解器
  • scipy.special:SPECFUN(这是一个实现了许多常用数学函数(如伽马函数)的Fortran库)的包装器
  • scipy.stats:标准连续和离散概率分布(如密度函数、采样器、连续分布函数等)、各种统计检验方法,以及更好的描述统计法
  • scipy.weave:利用内联C++代码加速数组计算的工具

定积分scipy.integrate

导入积分模块:

import numpy as np #导入numpy库
from scipy import integrate #导入定积分模块

scipy.integrate.quad(func,a,b):计算单重积分,参数分别为被积函数(f(x))、积分下限、积分上限

res, err = integrate.quad(np.sin, 0, np.pi/2) # 对sin函数在[0,$\pi/2$]区间上积分,quad函数返回两个值,第一个为积分结果,第二个为误差值
print(integrate.quad(lambda x:x**2,0,1)) # 计算x**2的定积分,积分区间为0到1,并输出结果

scipy.integrate.dblquad(func,a,b,gfun,hfun):计算双重积分,参数分别为被积函数(f(y,x))、x的积分下限、x的积分上限、y的积分下限、y的积分上限

print(integrate.dblquad(lambda x,y:x**2+y,0,2,lambda x:0,lambda x:1)) #对x**2+y求定积分,x积分区间[0,1],y积分区间[0,2],并输出结果

scipy.integrate.nquad(func,ranges):计算多重积分,参数分别为被积函数(f(x0,x1,…,xn))、积分区间(格式为[[a,b],[c,d],[e,f]],依次为x0、x1、x2、的积分区间)

def f(x,y):
    return x**2+y
 
def bound_x():
    return [0,1]
 
def bound_y():
    return [0,2]
 
print(integrate.nquad(f,[bound_x,bound_y]))

优化器scipy.optimize

导入模块

import numpy as np #导入numpy库
from scipy import optimize #导入优化模块

scipy.optimize.minimize(func,x0,args=(),method=None,jac=None):计算标量函数的最小值,参数分别为标量函数、初值、、寻优方法

寻优方法有:

插值scipy.interpolate

导入模块

import numpy as np #导入numpy库
from scipy import interpolate #导入interpolate模块
import matplotlib.pyplot as plt #导入绘图模块
x = np.linspace(0, 1, 10) #创建数组,相当于x
y = np.sin(2 * np.pi * x) #相当于y

  

scipy.interpolate.interp1d():1维插值函数

linear_f = interpolate.interp1d(x, y) #线性插值函数
x_new = np.linspace(0, 1, 50) #插值后的x
y_new = linear_f(x_new) #线性插值后的y
cubic_f = interpolate.interp1d(x, y, kind='cubic') #应用插值函数
cubic_y = cubic_f(x_new) #插值后的y值 

展示效果

plt.figure()
plt.plot(x, y, 'o', ms=6, label='x')
plt.plot(x_new, y_new, label='linear interp')
plt.plot(x_new, cubic_y, label='cubic interp')
plt.legend()
plt.show()

线性计算与矩阵分解scipy.linalg

导入模块

import numpy as np #导入numpy库
from scipy import linalg as lg #导入scipy库的linalg模块
arr=np.array([[1,2],[3,4]]) #创建方阵arr
b=np.array([6,14]) #创建矩阵b

scipy.linalg.det():计算方阵的行列式

print('Det:',lg.det(arr)) #求矩阵arr的行列式

scipy.linalg.inv():计算方阵的逆矩阵

print('Inv:',lg.inv(arr)) #求矩阵arr的逆矩阵

scipy.linalg.eig():计算方阵的特征向量

print('Eig:',lg.eig(arr)) #求矩阵arr的特征向量

scipy.linalg.svd():对矩阵进行奇异值分解

print('SVD:',lg.svd(arr)) #对矩阵arr进行svd分解

scipy.linalg.lu():对矩阵进行LU分解

print('LU:',lg.lu(arr)) #对矩阵arr进行lu分解

scipy.linalg.qr():对矩阵进行QR分解

print('QR:',lg.qr(arr)) #对矩阵arr进行qr分解

scipy.linalg.schur():对矩阵进行Schur分解

print('Schur:',lg.schur(arr)) #对矩阵arr进行Schur分解

scipy.linalg.solve():方程组求解

print('Sol:',lg.solve(arr,b)) #求方程组arr*x=b的解

总结

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

相关文章

  • Python中实现字符串类型与字典类型相互转换的方法

    Python中实现字符串类型与字典类型相互转换的方法

    这篇文章主要介绍了Python中实现字符串类型与字典类型相互转换的方法,非常实用,需要的朋友可以参考下
    2014-08-08
  • 基于pyinstaller超级加密操作(加壳和转c)

    基于pyinstaller超级加密操作(加壳和转c)

    这篇文章主要介绍了基于pyinstaller超级加密操作 (加壳和转c),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python利用networkx画图绘制Les Misérables人物关系

    Python利用networkx画图绘制Les Misérables人物关系

    这篇文章主要为大家介绍了Python利用networkx画图处理绘制Les Misérables悲惨世界里的人物关系图,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 对python的文件内注释 help注释方法

    对python的文件内注释 help注释方法

    今天小编就为大家分享一篇对python的文件内注释 help注释方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 基于Python实现绘制一个足球

    基于Python实现绘制一个足球

    这篇文章主要为大家详细介绍了如何基于Python实现绘制一个简单的足球,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以尝试一下
    2023-02-02
  • 使用pyinstaller打包PySide2程序中遇到的问题

    使用pyinstaller打包PySide2程序中遇到的问题

    说到打包,我们就需要用到python程序的打包工具pyinstaller了,这个包安装简单,使用同样简单,下面这篇文章主要给大家介绍了关于使用pyinstaller打包PySide2程序中遇到的问题,需要的朋友可以参考下
    2023-05-05
  • python 实现快速生成连续、随机字母列表

    python 实现快速生成连续、随机字母列表

    今天小编就为大家分享一篇python 实现快速生成连续、随机字母列表,具有很好的价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python光学仿真面向对象光学元件类的实现

    python光学仿真面向对象光学元件类的实现

    这篇文章主要为大家介绍了python光学仿真面向对象光学元件类的实现示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • python获取http请求响应头headers中的数据的示例

    python获取http请求响应头headers中的数据的示例

    这篇文章主要介绍了python获取http请求响应头headers中的数据,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Python操作Excel之xlsx文件

    Python操作Excel之xlsx文件

    前段时间做一个项目,不得不使用Python直接生成Excel文件,后来随着需求的变化,还要对已有的Excel文件进行读取。所以想着记录下来,这篇文章主要给大家介绍了Python操作Excel之xlsx文件的相关资料,需要的朋友可以参考下。
    2017-03-03

最新评论