Python与Matlab数据互通及SciPy核心模块详解
本文详解Python与Matlab数据互通技巧,重点介绍SciPy库中scipy.io模块的savemat函数用法。同时系统梳理SciPy核心子模块,包括integrate数值积分、optimize优化器、interpolate插值及linalg线性代数模块,提供具体代码示例与参数说明,助力Python科学计算与数据分析。
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是一套专门解决科学计算中各类标准问题域的Python包集合,主要涵盖以下模块:
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))、积分下限a、积分上限b
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的积分下限a、x的积分上限b、y的下限函数gfun、y的上限函数hfun
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))、积分区间ranges(格式为[[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):用于计算标量函数的最小值,参数分别为标量函数func、初值x0、额外参数args、寻优方法method
支持的寻优方法包括:
插值模块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]) #创建矩阵bscipy.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的解总结
以上为个人经验分享,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









