Scipy科学家计算库

模块名
功能说明
cluster
层次聚类模块,包含矢量量化, k-means 算法等
constants
数学科学常量模块,里面提供了大量数学科学常量
fftpack
快速傅里叶变换模块,可以进行 FFT/ DCT/ DST 等操作
integrate
积分模块,求多重积分、高斯积分、解常微分方程等
interpolate
插值模块,提供各种一维、二维、 N 维插值算法,包括 B 样条插值、
径向基函数插值等
io
IO 模块,提供操作多种文件的接口,如 matlab 文件、 IDL 文件、
Wav (音频)文件、 ARFF 文件等。
misc
图像操作模块,提供图像打开保存、翻转,旋转,剪裁等操作
linalg
线性代数模块,提供各种线性代数中的常规操作
ndimage
多维图像处理模块
optimize
优化模块,包含各种优化算法。用来求有 / 无约束的多元标量函数最小值算法、最
小二乘法,求有 / 无约束的单变量函数最小值算法,还有解各种复杂方程的算法
signal
信号处理模块,包括样条插值,卷积,差分等滤波方法, FIR/IIR 滤波,中值、排
序、维纳、希尔伯特等滤波器,各种谱分析算法等
sparse
稀疏矩阵模块,提供了大型稀疏矩阵计算中的各种算法
spatial
空间结构模块,提供了一些空间相关的数据结构和算法,如 Delaunay 三角剖分,
共面点,凸包,维诺图, KD 树等
special
特殊函数模块,包含有各种特殊的数学函数,可以直接调用,如立方根方法、指
数方法、 Gamma 方法等
stats
统计模块,提供了一些统计学上常用的方法
Scipy的线性代数子模块:scipy.linalg
计算方阵行列式:det()]
from scipy import linalg
import numpy as np
#矩阵
A=np.array([[1,2,-1],[3,4,7],[9,10,-2]])
x=linalg.det(A)
print(x)
特征值,特征向量
from scipy import linalg
import numpy as np
#矩阵
A=np.array([[1,2,-1],[3,4,7],[9,10,-2]])
l,v=linalg.eig(A)
print('特征值',l)
print('特征向量',v)

计算逆矩阵

from scipy import linalg
import numpy as np
#矩阵
A=np.array([[1,2,-1],[3,4,7],[9,10,-2]])
B=linalg.inv(A)
print('A的逆矩阵',B)
print('A*B:',np.matmul(A,B))

lu分解

from scipy import linalg
import numpy as np
A=np.array([[1,2,-1],[5,3,4],[9,7,11]])result=linalg.lu(A)
print('矩阵A分解的三个矩阵为:\n')
for i in result:
    print(i)
    print('\n')
r1=np.matmul(result[0],result[1]);
rA=np.matmul(r1,result[2]);
print('result[0]*result[1]*result[2]=\n')
print(rA)

QR分解:

from scipy import linalg
import numpy as np
A = np.array([[1,2,-1],[5,3,4],[9,7,11]])
result= linalg.qr(A)
print ('矩阵A分解的两个矩阵为:\n')
for i in result:
     print(i)
     print('\n')
rA=np.matmul(result[0],result[1]);
print('result[0]*result[1]=\n')
print(rA)
print('矩阵q的行列式等于:',linalg.det(result[0]))
    
解线性方程组Ax=b: scipy.linalg.solve(A,b)
from scipy import linalg
import numpy as np
A = np.array([[1,2,-1],[5,3,4],[9,7,11]])
b=np.array([-1,2,4])
x= linalg.solve(A,b)
print ('原方程组的解为x:\n')
print(x);
print('验算一下,A*x=\n');
print(np.matmul(A,x))

Scipy插值

一维分段插值interp1d()
scipy.interpolate.interp1d(x,y,kind='linear',axis=-1,copy=True,bounds_error=None,fill_value=NaN,
assume_sorted=False)
x,y: 长度相同的存储自变量数据、因变量数据一维数组
axis :int,optional,指定要沿其进行插值的y轴。插值默认为y的最后一个轴
kind: str or int,optional,设置插值类型的参数
assume_sorted :bool,optional,如果为False,则x的值可以按任何顺序排
列,并且将首先对其进行排序。如果为True,则x必须是单调递增值的数组
示例:
import numpy as np
from scipy import interpolate 
import pylab as pl
x=np.linspace(0,10,11)
y=np.sin(x)
xnew=np.linspace(0,10,101)
pl.plot(x,y,'ro')
list1=['linear','nearest','cubic']forkindinlist1:
      print(kind)
      f=interpolate.interp1d(x,y,kind=kind)
      #f是一个函数,用这个函数就可以找插值点的函数值了:
      ynew=f(xnew)
      pl.plot(xnew,ynew,label=kind)
pl.legend(loc='lowerright')
pl.show()
#单变量分段样条插值(可用于外插值)
UnivariateSpline(x,y,w=None,bbox=[None,None],k=3,s=None)
x,y 是X-Y坐标数组
w 是每个数据点的权重值
k 为样条曲线的阶数,1<=k<=5,默认k=3
bbox 2-sequencespecifyingtheboundaryoftheapproximation
interval.IfbboxisNone,bbox=[x[0],x[-1]].DefaultisNone.
s 为平滑参数。
s=0,样条曲线强制通过所有数据点
s>0,满足∑(w(y−spline(x))) 2 ≤s
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x1=np.linspace(0,10,20)
y1=np.sin(x1)
sx1=np.linspace(0,12,100)超过10,外插值
func1=interpolate.UnivariateSpline(x1,y1,s=0)#强制通过所有点
sy1=func1(sx)
plt.plot(x1,y1,'o')
plt.plot(sx1,sy1)
plt.show()
二维网格数据分段插值
f=interp2d(x,y,z,kind= 'linear')
from scipy import interpolate
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
#创建网格
xx,yy=np.meshgrid(x,y)
z=np.sin(xx**2+yy**2)
f = interpolate.interp2d(x, y, z, kind='cubic')
xnew = np.arange(-5.01, 5.01, 1e-2)
ynew = np.arange(-5.01, 5.01, 1e-2)
znew = f(xnew, ynew)
#返回时要求一维数组
plt.plot(x, z[0, :],'ro-', xnew, znew[0, :],'b-')
plt.show()
二维网格数据插值的三维展示
from scipy import interpolate
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-1.5, 1.5, 0.3)
y = np.arange(-1.5, 1.5, 0.3)
xx,yy=np.meshgrid(x,y)
z=np.sin(xx**2+yy**2);
fig=plt.figure(figsize=(18,9));
ax1=plt.subplot(1,2,1,projection='3d');
surf1=ax1.plot_surface(xx,yy,z)#绘制原始数据后成的第一个子图
f = interpolate.interp2d(xx,yy,z,kind='cubic')

xnew = np.arange(-1.5, 1.5, 1e-2)
ynew = np.arange(-1.5, 1.5, 1e-2)
znew = f(xnew, ynew)
xx_new,yy_new=np.meshgrid(xnew,ynew)
ax2=plt.subplot(1,2,2,projection='3d');
surf2=ax2.plot_surface(xx_new,yy_new,znew)#根据插值绘制第二个子图
一维数据的拉格朗日插值
from scipy.interpolate import lagrange
poly=lagrange(x,y)#x,y分别是两个长度相同的已知数据构成的数组
from scipy.interpolate import lagrange
import numpy as np
x = np.array([0, 1, 2])
y = x**3
poly = lagrange(x, y)
print(type(poly))#打印出它的类型
print(poly)

Scipy数据的最小二乘逼近

拟合:

numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
  • x:array_like,形状为 (M,) 或 (M, K),M 个样本点的 x 坐标。
  • y:array_like,形状为 (M,) 或 (M, K),M 个样本点的 y 坐标。
  • deg:int,拟合多项式的阶数。
  • w:array_like,形状为 (M,),可选,样本点的权重。
  • rcond:float,可选,拟合条件数的阈值。
  • cov:bool 或 str,可选,如果给定且非 False,则返回估计值及其协方差矩阵。
  • 返回值
  • p: 多项式的系数,最高次幂在前。如果 y 是 2 维数组,那么 k-th 数据集的系数在 p[:, k] 中。

  • residuals:

    残差的平方和,仅当 full == True 时返回。
  • rank

    • 缩放后的范德蒙德系数矩阵的有效秩,仅当 full == True 时返回。
  • singular_values

    • 缩放后的范德蒙德系数矩阵的奇异值,仅当 full == True 时返回。
  • rcond

    • 使用的 rcond 值,仅当 full == True 时返回。
  • V

    • 多项式系数估计的协方差矩阵,仅当 full == False 且 cov == True 时返回。

 示例;

import numpy as np
import matplotlib.pyplot as plt
xu=np.random.rand(50)*4*np.pi-2*np.pi
f=lambda x:np.sin(x)+0.5*x
yu=f(xu)
print(xu[:10].round(2))
print(yu[:10],round(2))
# 使用最小二乘法拟合 xu 和 yu 之间的多项式,这里拟合的是5次多项式,结果存储在 My_fit 中。
My_fit=np.polyfit(xu,yu,5)
# 使用拟合得到的多项式系数 My_fit 计算出在 xu 上的拟合值,结果存储在 ry 中。
ry=np.polyval(My_fit,xu)
#绘图
plt.plot(xu,yu,'b^',label='f(x)')
plt.plot(xu,ry,'r.',label='polynomial fitting')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.show()

最小二乘逼近;

scipy.optimize.curve_fit(f,xdata,ydata,p0=None,sigma=None,absolute_sigma=
False,check_finite=True,bounds=(-inf,inf),method=None,jac=None,
**kwargs)
Parameters
Ø f :需要拟合的函数模型
Ø xdata array_like, x-coordinates of the M sample points
Ø ydata array_like, y-coordinates of the sample points.
Ø p0 f 中需要拟合的参数初始值 .
Ø bounds :参数的搜索区间
Returns
Ø popt array ,参数的最优值
Ø pcov :最有参数的协方差矩阵
示例:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

x = np.array(range(10))
y =np.array([0,1,2,3,4,5,4,3,2,1])
#定义模型及参数
def gaussian(x,*param):
      return param[0]*np.exp(-np.power(x - param[2], 2.) / 
           (2*np.power(param[4], 2.)))+\param[1]*np.exp(-np.power(x - 
            param[3],2.) / (2 * np.power(param[5], 2.)))

popt,pcov = curve_fit(gaussian,x,y,p0=[3,4,3,6,1,1])
print('模型的系数为:',popt)
print('系数的协方差矩阵为:',pcov)
plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaussian(x,*popt),'ro:',label='fit')
plt.legend()
plt.show()

  • 46
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值