1、第14章 高级科学计算库SciPy本章目录本章目录第14章 高级科学计算库SciPy本章学习目标本章学习目标了解了解SciPySciPy库的三种安装方式库的三种安装方式掌握数值积分模块的使用掌握数值积分模块的使用掌握插值模块的使用掌握插值模块的使用掌握概率统计模块的使用掌握概率统计模块的使用掌握优化模块的使用掌握优化模块的使用掌握其他常用模块的掌握其他常用模块的使用使用思维导图思维导图第14章 高级科学计算库SciPy5Python程序设计程序设计第14章 高级科学计算库SciPy SciPy(SciPy(读作读作“Sigh Pie”“Sigh Pie”)是一个免费的开源)是一个免费的开源 P
2、ython Python 库,其构建于库,其构建于 NumPy NumPy库之库之上,并在上,并在NunPyNunPy的基础上增加了数学、科学以及工程等众多领域计算中常用的方法的基础上增加了数学、科学以及工程等众多领域计算中常用的方法模块,例如线性代数、常微分方程求解、信号处理、图像处理、稀疏矩阵等。模块,例如线性代数、常微分方程求解、信号处理、图像处理、稀疏矩阵等。 MATLABMATLAB和和ScilabScilab功能都比较强大,但两者都属于商业软件,收费昂贵并且不允许功能都比较强大,但两者都属于商业软件,收费昂贵并且不允许修改源码。修改源码。 与与MATLABMATLAB和和Scila
3、bScilab相比,相比,SciPySciPy具有免费开源、功能强大、简单易学易用等优点。具有免费开源、功能强大、简单易学易用等优点。此外,此外,SciPySciPy基于基于PythonPython编程语言编程语言实现实现,代码可读性、可维护性也比较好。,代码可读性、可维护性也比较好。u 定义:定义:u 优点:优点:6Python程序设计程序设计第14章 高级科学计算库SciPyu SciPySciPy与其他计算库的对比:与其他计算库的对比:表表14-1 SciPy14-1 SciPy和和MATLABMATLAB、ScilabScilab优缺点对比优缺点对比 SciPyMATLAB、Scila
4、b优点优点开源免费,代码可读性强、可维护性好,易学易用功能更加强大,专业性强缺点缺点代码运行效率不如MATLAB好,功能不如MATLAB丰富商业化,价格昂贵,源码不允许修改7Python程序设计程序设计第14章 高级科学计算库SciPy方法一:方法一: 使用使用Python Python 软件自带的包管理工具软件自带的包管理工具pippip进行安装。进行安装。 命令:命令:pip install scipy8Python程序设计程序设计第14章 高级科学计算库SciPy方法二:利用方法二:利用AnnocondaAnnoconda 虚拟环境进行虚拟环境进行SciPySciPy库的安装。库的安装。
5、 命令:命令:conda install scipy9Python程序设计程序设计第14章 高级科学计算库SciPyu 求解矩阵行列式求解矩阵行列式计算矩阵的行列式可以直接使用计算矩阵的行列式可以直接使用SciPySciPy中中linalglinalg模块的模块的detdet方法,方法,该方法将矩阵作为输入并返回一个标量值。该方法将矩阵作为输入并返回一个标量值。10Python程序设计程序设计第14章 高级科学计算库SciPy模块名模块名功能说明功能说明cluster层次聚类模块,包含矢量量化,k-means算法等constants数学科学常量模块,里面提供了大量数学科学常量fftpack快速
6、傅里叶变换模块,可以进行FFT/ DCT/ DST等操作integrate积分模块,求多重积分、高斯积分、解常微分方程等interpolate插值模块,提供各种一维、二维、N维插值算法,包括B样条插值、径向基函数插值等ioIO模块,提供操作多种文件的接口,如matlab文件、IDL文件、Wav(音频)文件、ARFF文件等。misc图像操作模块,提供图像打开保存、翻转,旋转,剪裁等操作linalg线性代数模块,提供各种线性代数中的常规操作u SciPySciPy主要模块主要模块11Python程序设计程序设计第14章 高级科学计算库SciPy模块名模块名功能说明功能说明ndimage多维图像处理
7、模块optimize优化模块,包含各种优化算法。用来求有/无约束的多元标量函数最小值算法、最小二乘法,求有/无约束的单变量函数最小值算法,还有解各种复杂方程的算法signal信号处理模块,包括样条插值,卷积,差分等滤波方法, FIR/IIR滤波,中值、排序、维纳、希尔伯特等滤波器,各种谱分析算法等sparse稀疏矩阵模块,提供了大型稀疏矩阵计算中的各种算法spatial空间结构模块,提供了一些空间相关的数据结构和算法,如Delaunay三角剖分,共面点,凸包,维诺图,KD树等special特殊函数模块,包含有各种特殊的数学函数,可以直接调用,如立方根方法、指数方法、Gamma 方法等stats
8、统计模块,提供了一些统计学上常用的方法u SciPySciPy主要模块主要模块12Python程序设计程序设计第14章 高级科学计算库SciPyu scipy.integrate scipy.integrate 模块主要提供了数值积分和常微分方程组求解算法模块主要提供了数值积分和常微分方程组求解算法包含一重积分、多重积分及固定采样积分包含一重积分、多重积分及固定采样积分求解算法;求解算法;求解算法提供了基于求解算法提供了基于odeintodeint函数和基于函数和基于odeode类的方法。类的方法。13Python程序设计程序设计第14章 高级科学计算库SciPyu scipy.integra
9、te scipy.integrate 模块主要提供针对两类积分的求解方法模块主要提供针对两类积分的求解方法给定函数对象求积分给定函数对象求积分对固定采样样本数值求积分。对固定采样样本数值求积分。传统手工计算积分问题是一项非常繁琐的过程,工程应用中通传统手工计算积分问题是一项非常繁琐的过程,工程应用中通常都会利用常都会利用SciPy等类似的数据分析工具。等类似的数据分析工具。SciPy库已经封装好大量库已经封装好大量计算各种积分的方法,可以很大程度上提升工作效率。计算各种积分的方法,可以很大程度上提升工作效率。14Python程序设计程序设计第14章 高级科学计算库SciPyscipy.inte
10、grate scipy.integrate 模块提供了许多求解积分的方法,下表为常用方法。模块提供了许多求解积分的方法,下表为常用方法。函数函数名名功能说明功能说明quad一重积分求解方法dblquad二重积分求解方法tplquad三重积分求解方法nquadn重积分求解方法fixed_quad对 func(x) 做 N 维高斯积分quadrature求给定容限范围内的高斯积分romberg对函数做 Romberg 积分表表14-3 14-3 常用积分函数常用积分函数从表中可以看到 和可以满足数值积分的大部分需求。15Python程序设计程序设计第14章 高级科学计算库SciPyu 一重积分方法
11、一重积分方法quadquad参数名参数名描述描述func被积函数a积分下限b积分上限argsfunc 函数需要的额外参数,例如quad(func, a, b, args=(1,)。args参数必须以元组的形式传入 定义:定义: quad(func, a, b, args=(), .)16Python程序设计程序设计第14章 高级科学计算库SciPyu 二重积分二重积分dblquaddblquad 定义:定义:dblquad(func, a, b, gfun, hfun, args=(), .)参数名参数名描述描述func被积函数a积分下限b积分上限gfun积分区间下限hfun积分区间上限arg
12、sfunc 函数需要的额外参数,例如quad(func, a, b, args=(1,)。args参数必须以元组的形式传入17Python程序设计程序设计第14章 高级科学计算库SciPyuscipy.integrate scipy.integrate 模块中提供的采样样本求积分的常用方法,如下表模块中提供的采样样本求积分的常用方法,如下表方法名方法名描述描述trapz采用梯形法则求积分cumtrapz采用梯形法则求累计积分simps采用辛氏法则从样本中计算积分romb采用 Romberg 积分法从 (2*k+1) 均匀间隔样本中计算积分 (sampling) 是指把时间域或空间域的连续量转化
13、成离散量的过程。是指把时间域或空间域的连续量转化成离散量的过程。在数学中函数的积分值就是函数与坐标轴围成的图形的面积。因此把连续在数学中函数的积分值就是函数与坐标轴围成的图形的面积。因此把连续量转换成离散量后,就可以采用分割法求每部分面积然后求其累计值,进而估量转换成离散量后,就可以采用分割法求每部分面积然后求其累计值,进而估计出原函数的积分值。计出原函数的积分值。18Python程序设计程序设计第14章 高级科学计算库SciPyu trapztrapz方法是方法是ScipyScipy中利用分割法求面积的方法。中利用分割法求面积的方法。 定义:定义:trapz(y, x=None, dx=1.
14、0, axis=-1)参数名参数名描述描述y被积分的数值序列xy中元素的间距, 若x为None,则y元素的间距默认为dx。x默认为Nonedx标量。默认为 1axis整数类型。积分轴表14-6 trapz方法参数19Python程序设计程序设计第14章 高级科学计算库SciPy,指表示未知函数的导数以及自变量之间关系的方程。未知函数是一,指表示未知函数的导数以及自变量之间关系的方程。未知函数是一元函数的微分方程称作常微分方程,未知函数是多元函数的微分方程称作偏微元函数的微分方程称作常微分方程,未知函数是多元函数的微分方程称作偏微分方程。微分方程中出现的未知函数最高阶导数的阶数,称作微分方程的阶
15、。分方程。微分方程中出现的未知函数最高阶导数的阶数,称作微分方程的阶。 微分方程的数学定义式如下:微分方程的数学定义式如下: F(x, y, y, y.y(n) = 0方法名方法名描述描述odeint解常微分方程的通用函数ode使用 VODE 和 ZVODE 的方式进行 ode 求解微分方程complex_ode将复数值的 ode 转化为实数并求解微分方程表14-7 求解微分方程的方法odeint是基于函数的是基于函数的 API,ode类是面类是面向对象的向对象的API。通常。通常odeint更好上手,更好上手,而而ode类则更灵活一些。类则更灵活一些。20Python程序设计程序设计第14章
16、 高级科学计算库SciPy 插值是通过已知的离散数据求未知数据的方法。插值是通过已知的离散数据求未知数据的方法。 与拟合不同,插值要求曲线通过所有的已知数据。插值是离散函数逼近与拟合不同,插值要求曲线通过所有的已知数据。插值是离散函数逼近的重要方法,的重要方法, 利用它可通过函数在有限个点处的取值状况,估算出函利用它可通过函数在有限个点处的取值状况,估算出函数在其它点处的近似值。数在其它点处的近似值。 若函数若函数f(x)在自变量在自变量x(离散值离散值)所对应的函数值已知,求解出一个适当所对应的函数值已知,求解出一个适当的特定函数的特定函数p(x),使得,使得p(x)在在x处所取的函数值等于
17、处所取的函数值等于f(x)在在x处的已知值。处的已知值。从而用从而用p(x)来估计来估计f(x)在这些在这些x值之间的数所对应的函数值,这种方法值之间的数所对应的函数值,这种方法称为插值法。称为插值法。u 插值与拟合插值与拟合u 插值的数学定义插值的数学定义21Python程序设计程序设计第14章 高级科学计算库SciPyu interpldinterpld是一个类,其构造函数定义如下是一个类,其构造函数定义如下 _ _initinit_ (x, y, kind=linear, .)_ (x, y, kind=linear, .)参数名参数名描述描述xarray_like类型。一维的真实数据y
18、array_like类型。是一个N维的数据其长度必须等于沿某个插值轴的x的长度kind插值类型。可选。可以是字符串或整数的 kind类型:zero、nearest 阶梯插值,相当于0阶B样条曲线,slinear、linear 线性插值,用一条直线连接所有的取样点,相当于一阶B样条曲线,quadratic、cubic 二阶和三阶B样条曲线,更高阶的曲线可以直接使用整数值指定axis指定沿y的某个轴进行插值。默认是沿着y 的最后一个轴进行插值22Python程序设计程序设计第14章 高级科学计算库SciPy(1) (1) 首先生成离散值首先生成离散值x x(2) (2) 将将x x带入上面函数计算
19、出对应的函数值带入上面函数计算出对应的函数值(3) (3) 通过通过interpolate.interp1dinterpolate.interp1d方法求解出函方法求解出函数数p(x)p(x),interp1dinterp1d是一个类,其返回值是一个是一个类,其返回值是一个函数。函数。(4) (4) 生成新的样本点生成新的样本点xnewxnew,并通过,并通过(3)(3)求解出求解出的的p(x)p(x)函数计算出函数计算出 ynew ynew,实现插值。,实现插值。u 通过函数通过函数 来演示一维插值的过程。来演示一维插值的过程。图14-7 interp1d方法插值23Python程序设计程序
20、设计第14章 高级科学计算库SciPyu griddatagriddata方法方法 griddatagriddata(points(points, values, xi, method=linear, , values, xi, method=linear, fill_valuefill_value=nan)=nan)参数名参数名描述描述points表示K维空间中的坐标,它可以是形状为(N, K)的数组,也可以是一个有K个数组的序列,N为数据的点数values每个点对应的值xi需要进行插值运算的坐标,其形状为(M, K),M为需要进行插值运算的坐标的数量method参数有三个选项:neares
21、t、linear、cubic,分别对应0阶、1阶以及3阶插值24Python程序设计程序设计第14章 高级科学计算库SciPy 概率分布随机变量分为连续型和离散型。概率分布随机变量分为连续型和离散型。 在在SciPy库中所有的连续随机变量都是库中所有的连续随机变量都是rv_continuous的派生类对象,而所有的离的派生类对象,而所有的离散随机变量都是散随机变量都是 rv_discrete的派生类对象。的派生类对象。对随机变量进行随机取值,产生服从某种分布的一个样本集。,可以通过对随机变量进行随机取值,产生服从某种分布的一个样本集。,可以通过size参数参数指定输出的样本集大小指定输出的样本
22、集大小随机变量的概率密度函数。产生对应随机变量的概率密度函数。产生对应x的某种分布的的某种分布的y值值随机变量的累积分布函数,它是概率密度函数的积分随机变量的累积分布函数,它是概率密度函数的积分随机变量的生存函数,它的值是随机变量的生存函数,它的值是1-cdf(t)累积分布函数的反函数累积分布函数的反函数计算随机变量的期望值和方差计算随机变量的期望值和方差对一组随机取样进行拟合,找出最适合取样数据的概率密度函数的系数。如对一组随机取样进行拟合,找出最适合取样数据的概率密度函数的系数。如stats.norm.fit(x)就是将就是将x看成是某个看成是某个norm分布的抽样,求出其最好的分布的抽样
23、,求出其最好的 拟合参数拟合参数(mean, std)25Python程序设计程序设计第14章 高级科学计算库SciPy 连续型随机变量是指如果随机变量连续型随机变量是指如果随机变量x的所有可能取值不可以逐个列举的所有可能取值不可以逐个列举出来,而是取数轴上某一区间内的任一点的随机变量。出来,而是取数轴上某一区间内的任一点的随机变量。 正态分布函数是连续型的随机变量函数:正态分布函数是连续型的随机变量函数: loc为期望值,即对称轴位置,为期望值,即对称轴位置,scale 为标准差,即开口大小。为标准差,即开口大小。 SciPy中的正态分布函数默认中的正态分布函数默认 loc=0,scale=
24、1, 即标准正太分布。即标准正太分布。26Python程序设计程序设计第14章 高级科学计算库SciPyu 随机变量分为离散型随机变量与连续型随机变量两种 离散型随机变量与连续型随机变量都是由随机变量取值范围(或者说取离散型随机变量与连续型随机变量都是由随机变量取值范围(或者说取值形式)确定,变量取值只能取离散型的自然数,就是离散型随机变量。值形式)确定,变量取值只能取离散型的自然数,就是离散型随机变量。二项分布:二项分布:泊松分布:泊松分布:27Python程序设计程序设计第14章 高级科学计算库SciPy函数名函数名描述描述describe计算传递的数组的几个描述性统计信息gmean计算沿
25、指定轴的几何平均值hmean计算沿指定轴的调和平均值kurtosis计算数据集的峰度(Fisher或Pearson)kurtosistest测试数据集是否具有正常峰度mode返回传递的数组中的模态(最常见)值的数组moment计算样本平均值的第n个时刻normaltest测试样本是否与正态分布不同skew计算数据集的偏度28Python程序设计程序设计第14章 高级科学计算库SciPy函数名函数名描述描述skewtest测试偏斜是否与正态分布不同kstat返回第n个k统计量(到目前为止1=n=f(x),那么那么 x1 就是全局最大就是全局最大点。类似地,对于点。类似地,对于x中的所有中的所有x
26、,如果,如果f(x1)=f(x),那么那么 x1就是全局最小点。最大点处就是全局最小点。最大点处的函数值称为函数的最大值,最小点处的函数值称为函数的最小值。的函数值称为函数的最大值,最小点处的函数值称为函数的最小值。 SciPy中的模块中的模块optimize中提供了多种求解最小值的方法:中提供了多种求解最小值的方法: fminfmin fmin_powellfmin_powell fmin_cgfmin_cg fmin_bfgsfmin_bfgs fmin_ncgfmin_ncg brute brute等等u 最大值与最小值:前前5 5种优化函数如果所求函数存在局种优化函数如果所求函数存在局
27、部最小值和全局最小值,如果初始部最小值和全局最小值,如果初始值选取不当值选取不当就会就会得到局部最小值,得到局部最小值,而不是全局最小值。而不是全局最小值。34Python程序设计程序设计 fmin方法其定义:方法其定义:fmin(func, x0, args=(),)fmin(func, x0, args=(),)参数名参数名描述描述func定义求解最小值的函数x0多维数组。假设的最小值args元组类型。可选。func函数需要的额外参数第14章 高级科学计算库SciPy35Python程序设计程序设计第14章 高级科学计算库SciPyu fsolve方法隶属于optimize模块,其作用是求
28、解方程及方程组的解。 fsolvefsolve方法定义如下:方法定义如下:fsolvefsolve( (funcfunc, , x0 x0,argsargs=(),)=(),) fsolvefsolve方法中常用参数有两个:方法中常用参数有两个:funcfunc(x)(x)是计算方程组误差的函数,它的参数是计算方程组误差的函数,它的参数x x是一个矢量,表示方程组的各个未知数的一组可能解,是一个矢量,表示方程组的各个未知数的一组可能解,funcfunc返回将返回将x x代入方程组之代入方程组之后得到的误差;后得到的误差;x0 x0为未知数矢量的初始值。为未知数矢量的初始值。参数名参数名描述描述
29、func定义方程组的误差函数 x0多维数组。func(x) = 0的根的最初估计值args元组类型。可选。func函数需要的额外参数36Python程序设计程序设计第14章 高级科学计算库SciPy37Python程序设计程序设计第14章 高级科学计算库SciPy scipy.linalg模块提供了线性代数模块提供了线性代数中运算的基本方法。中运算的基本方法。 例如,求解矩阵的行列式、矩阵例如,求解矩阵的行列式、矩阵的逆,解线性方程组,求解求特的逆,解线性方程组,求解求特征值和特征向量等。征值和特征向量等。38Python程序设计程序设计第14章 高级科学计算库SciPy scipy.io(输
30、入和输出)模块提供了广泛的文件操作功能,可以处理不同格(输入和输出)模块提供了广泛的文件操作功能,可以处理不同格式的文件。式的文件。 例如:例如:Matlab文件,文件,IDL,Matrix Market,Wave,Arff,Netcdf 等等方法名方法名描述描述loadmat加载MATLAB文件savemat保存MATLAB文件whosmat列出MATLAB文件中的变量 .mat.mat文件操作方法文件操作方法39Python程序设计程序设计第14章 高级科学计算库SciPyuscipy.ndimage模块提供了专用于图像处理的ndimage模块该模块实现了图像处理中的一些常见任务。例如:该
31、模块实现了图像处理中的一些常见任务。例如: 输入输入/ /输出,显示图像输出,显示图像 基本基本操作操作: :裁剪,翻转,旋转等裁剪,翻转,旋转等 图像图像过滤过滤: :去噪,锐化等去噪,锐化等 图像图像分割分割: :标记与不同对象相对应的像素标记与不同对象相对应的像素 分类分类 特征提取特征提取40Python程序设计程序设计第14章 高级科学计算库SciPyu 打开图像u 翻转图像41Python程序设计程序设计第14章 高级科学计算库SciPyuscipy.special模块中提供了一些常用的函数及一些特殊功能。 立方根方法立方根方法 指数方法指数方法 相对误差相对误差指数指数方法方法 指数和指数和的对数的对数方法方法 Lambert Lambert方法方法 排列排列组合组合方法方法 Gamma Gamma 方法方法等等42Python程序设计程序设计第14章 高级科学计算库SciPy本本 章章 小小 结结介绍了SciPy库的特点,安装方式以及SciPy库的众多模块及其功能,使大家在整体上对SciPy库有初步认识。详细介绍了若干常用的模块,并通过大量典型实例使大家理解并掌握常用模块的适用范围及基本用法通过本章的学习使得大家能够熟练掌握SciPy库的基本功能和使用方法,具备在实际项目中的应用实践能力,提升数据分析工作效率。第14章 高级科学计算库SciPy