大师兄的Python机器学习笔记:Numpy库、Scipy库和Matplotlib库(一)
大师兄的Python机器学习笔记:Numpy库、Scipy库和Matplotlib库 (三)
三、Scipy库
1. Scipy库的功能
- 主要用于数学、科学和工程计算。
- 依赖Numpy库和Numpy数组,与Numpy协作高效解决问题。
- 可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。
2. scipy.constants模块
- scipy.constants模块包含的是科学领域的常量。
2.1 数学常量
1)pi
- π
>>>from scipy.constants import pi >>>print(pi) 3.141592653589793
2)golden
- 黄金比例。
>>>from scipy.constants import golden >>>print(golden) 1.618033988749895
2.2 物理常数
1)c / speed_of_light
- 真空光速。
>>>from scipy.constants import c >>>print(c) 299792458.0 >>>from scipy.constants import speed_of_light >>>print(speed_of_light) 299792458.0
2)h / Planck
- 普朗克常数
>>>from scipy.constants import h >>>print(h) 6.62607004e-34 >>>from scipy.constants import Planck >>>print(Planck) 6.62607004e-34
3)G
- 引力
>>>from scipy.constants import G >>>print(G) 6.67408e-11
4)e
- 电荷
>>>from scipy.constants import e >>>print(e) 1.6021766208e-19
5)R
- 摩尔气体常数
>>>from scipy.constants import R >>>print(R) 8.3144598
6)Avogadro
- 阿芙伽罗常数
>>>from scipy.constants import Avogadro >>>print(Avogadro) 6.022140857e+23
7)k
- 玻耳兹曼常量
>>>from scipy.constants import k >>>print(k) 1.38064852e-23
8)electron_mass / m_e
- 电子质量
>>>from scipy.constants import electron_mass >>>print(electron_mass) 9.10938356e-31 >>>from scipy.constants import m_e >>>print(m_e) 9.10938356e-31
9)proton_mass / m_p
- 质子质量
>>>from scipy.constants import proton_mass >>>print(proton_mass) 1.672621898e-27 >>>from scipy.constants import m_p >>>print(m_p) 1.672621898e-27
10)neutron_mass / m_n
- 中子质量
>>>from scipy.constants import neutron_mass >>>print(neutron_mass) 1.674927471e-27 >>>from scipy.constants import m_n >>>print(m_n) 1.674927471e-27
2.3 常用单位
单位 值 milli 0.001 micro 1e-06 kilo 1000 以及更多单位。
>>>from scipy.constants import milli,micro,kilo >>>print("milli:",milli) milli: 0.001 >>>print("micro:",micro) micro: 1e-06 >>>print("kilo:",kilo) kilo: 1000.0
2.4 更多常量
常量 值 gram 1克 atomic_mass 原子质量常数 degree 1弧度 minute 60秒 day 一天几秒 inch 一英寸表示为多少米 micron 一微米表示为多少米 light_year 一光年表示为多少米 atm 帕斯卡为单位表示的标准大气压 acre 一英亩表示为多少平方米 liter 一升以立方米为单位表示 gallon 一加仑以立方米为单位表示 kmh 千米每小以米每秒为单位表示 degree_Fahrenheit 凯尔文氏以华氏度表示 eV 1电子伏以焦耳表示 hp 马力以瓦特表示 dyn 达因以牛顿表示 >>>from scipy.constants import * >>>constants = ["gram","atomic_mass","degree","minute","day","inch","micron","light_year","atm","acre","liter","gallon","kmh","degree_Fahrenheit","eV","hp","dyn","lambda2nu"] >>>for x in constants: >>> print("{title}:{value}".format(title=x,value=eval(x))) gram:0.001 atomic_mass:1.66053904e-27 degree:0.017453292519943295 minute:60.0 day:86400.0 inch:0.0254 micron:1e-06 light_year:9460730472580800.0 atm:101325.0 acre:4046.8564223999992 liter:0.001 gallon:0.0037854117839999997 kmh:0.2777777777777778 degree_Fahrenheit:0.5555555555555556 eV:1.6021766208e-19 hp:745.6998715822701 dyn:1e-05
2.4 find(<name="">)
- 用于通过名称查找常量
>>>from scipy.constants import find >>>find("kilo") ['atomic mass unit-kilogram relationship', 'electron volt-kilogram relationship', 'hartree-kilogram relationship', 'hertz-kilogram relationship', 'inverse meter-kilogram relationship', 'joule-kilogram relationship', 'kelvin-kilogram relationship', 'kilogram-atomic mass unit relationship', 'kilogram-electron volt relationship', 'kilogram-hartree relationship', 'kilogram-hertz relationship', 'kilogram-inverse meter relationship', 'kilogram-joule relationship', 'kilogram-kelvin relationship']
3. scipy.special模块
- scipy.special模块包含了一些杂项函数。
- 由于函数量太大,仅列出部分函数,完整版请参考官方文档。
1)cbrt(<N>)
- <N>尽量使用N数组。
- 返回数组每个元素的立方根。
>>>import numpy as np >>>from scipy.special import cbrt >>>n = np.arange(1,20) >>>res = cbrt(n) >>>print(res) [1. 1.25992105 1.44224957 1.58740105 1.70997595 1.81712059 1.91293118 2. 2.08008382 2.15443469 2.22398009 2.28942849 2.35133469 2.41014226 2.46621207 2.5198421 2.57128159 2.62074139 2.66840165]
2)exp10(<N>)
- 返回数组每个元素的指数函数。
>>>import numpy as np >>>from scipy.special import exp10 >>>n = np.arange(1,20) >>>res = exp10(n) >>>print(res) [1.e+01 1.e+02 1.e+03 1.e+04 1.e+05 1.e+06 1.e+07 1.e+08 1.e+09 1.e+10 1.e+11 1.e+12 1.e+13 1.e+14 1.e+15 1.e+16 1.e+17 1.e+18 1.e+19]
3)sindg(<N>)
- 返回数组每个元素(角度)的正弦函数。
>>>import numpy as np >>>from scipy.special import sindg >>>n = np.array([0,30,60,90]) >>>res = sindg(n) >>>print(res) [0. 0.5 0.8660254 1. ]
4)round(<N>)
- 返回数组每个元素的四舍五入值。
>>>import numpy as np >>>from scipy.special import round >>>n = np.array([1.23,100.01,-23.12,3.1415]) >>>res = round(n) >>>print(res) [ 1. 100. -23. 3.]
5)comb(<N>,<k>)
- 返回以数组中每个元素作为个数,从个数中选择<k>个随机数的组合数。
>>>import numpy as np >>>from scipy.special import comb >>>n = np.arange(1,20) >>>res = comb(n,2) >>>print(res) [ 0. 1. 3. 6. 10. 15. 21. 28. 36. 45. 55. 66. 78. 91. 105. 120. 136. 153. 171.]
6)perm(<N>,<k>)
- 返回以数组中每个元素作为个数,从个数中选择<k>个随机数的排列数。
>>>import numpy as np >>>from scipy.special import perm >>>n = np.arange(1,20) >>>res = perm(n,2) >>>print(res) [ 0. 2. 6. 12. 20. 30. 42. 56. 72. 90. 110. 132. 156. 182. 210. 240. 272. 306. 342.]
7)gamma(<N>)
- 返回数组每个元素的gamma分布值。
>>>import numpy as np >>>from scipy.special import gamma >>>n = np.arange(1,20) >>>res = gamma(n) >>>print(res) [1.00000000e+00 1.00000000e+00 2.00000000e+00 6.00000000e+00 2.40000000e+01 1.20000000e+02 7.20000000e+02 5.04000000e+03 4.03200000e+04 3.62880000e+05 3.62880000e+06 3.99168000e+07 4.79001600e+08 6.22702080e+09 8.71782912e+10 1.30767437e+12 2.09227899e+13 3.55687428e+14 6.40237371e+15]
8)beta(<a>,<b>)
- 返回数组<a>,<b>每个元素对应的beta分布值。
- beta(<a>,<b>) = gamma(<a>) * gamma(<b>) / gamma(<a> +<b>)
>>>import numpy as np >>>from scipy.special import beta >>>n1 = np.arange(0.1,1) >>>n2 = np.arange(1,10) >>>res = beta(n1,n2) >>>print(res) [10. 9.09090909 8.65800866 8.37871806 8.17435908 8.01407753 7.88269921 7.77167528 7.67572867]
4. scipy.K-Means模块
- 包含聚类工具,将相似的数据归类到同一类别。
- 引用位置:
Scipy.cluster.vq
- 准备数据:
>>>import numpy as np
>>>from numpy.random import rand
>>>data = np.stack(((rand(1,10)+np.arange(0.01,0.1)),rand(1,10)))
>>>print(data)
[[[0.52725988 0.49689366 0.75202077 0.17472057 0.20556629 0.11345316
0.10091491 0.63352045 0.70583981 0.91223879]]
[[0.26358852 0.6033158 0.09409396 0.40834894 0.89472134 0.32503465
0.92269377 0.40634446 0.44611134 0.10560189]]]
1)whiten(<data>)
- 白化数据,是一种常见的数据预处理方法,用于去除样本数据的冗余信息。
>>>from scipy.cluster.vq import whiten >>>whiten(data) array([[[ 3.99937168, 9.33816373, 2.28603171, 1.49571367, 0.59657485, 1.07242991, 0.24560113, 5.57735393, 5.43521317, 2.26183253]], [[ 1.99937168, 11.33816373, 0.28603171, 3.49571367, 2.59657485, 3.07242991, 2.24560113, 3.57735393, 3.43521317, 0.26183253]]])
2)kmeans(<data>,<k>)
- 将数据分成k个聚类,并计算聚类的中心点。
>>>from scipy.cluster.vq import kmeans >>>centroids,_=kmeans(data,2) >>>print(centroids) [[1.01341581 0.93636675 1.01109258] [0.51448817 0.50702164 0.50066985]] >>>print(_) 0.4501383917858607
3)vq(<data>,<centroids>)
- 根据中心点<centroids>返回聚类和元素到中心点的距离。
>>>from scipy.cluster.vq import vq >>>clx,dist = vq(data,centroids) >>>print(clx) [0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
5. fftpack模块
- 包含傅里叶变换的算法工具。
1)fft(<data>)
- 实现快速傅里叶变换。
>>>import numpy as np >>>from scipy.fftpack import fft >>># 采样点数 >>>N = 2000 >>># 才样品路 >>>Fs = 4000 >>>n = np.array([np.cos(0),np.cos(np.pi/2),np.cos(np.pi),np.cos(np.pi*2)]) >>>yf = fft(n) >>> >>># 振幅 >>>abs_yf = np.abs(yf) >>># 相位 >>>angle_y = np.angle(yf) >>>print('傅里叶变换:',yf) >>>print('直流信号') >>>print('振幅:',abs_yf[0]/N) >>>print('相位:',angle_y) 傅里叶变换: [ 1.+0.j 2.+1.j -1.+0.j 2.-1.j] 直流信号 振幅: 0.0005 相位: [ 0. 0.46364761 3.14159265 -0.46364761]
2)ifft(<data>)
- 实现快速傅里叶逆变换。
- 与fft()互逆。
>>>import numpy as np >>>from scipy.fftpack import ifft >>>n = np.array([ 1.+0.j, 2.+1.j, -1.+0.j, 2.-1.j]) >>>ifft(n) array([ 1.+0.j, 0.+0.j, -1.+0.j, 1.+0.j])
3)dct(<data>)
- 返回离线余弦变换。
- 离散余弦变换(DCT)是对实信号定义的一种变换,变换后在频域中得到的也是一个实信号,相比离散傅里叶变换DFT而言, DCT可以减少一半以上的计算。
>>>import numpy as np >>>from scipy.fftpack import dct >>>n = np.array([np.cos(0),np.cos(np.pi/2),np.cos(np.pi),np.cos(np.pi*2)]) >>>dct(n) array([ 2. , 0.76536686, 4.24264069, -1.84775907])
4)idct(<data>)
- 返回离散余弦逆变换。
>>>import numpy as np >>>from scipy.fftpack import dct >>>n = np.array([np.cos(0),np.cos(np.pi/2),np.cos(np.pi),np.cos(np.pi*2)]) >>>idct(n) array([ 0.3511533 , 0.5664545 , 4.26197263, -1.17958043])
6. integrate模块
- 提供积分相关的方法。
1)quad(<f>,<a>,<b>,<args=None>)
- 求函数f(x)的一重积分。
- <a>,<b>分别是函数的上限和下限,<args>是函数的系数参数。
- 返回两个值,分别是积分值和积分值的绝对误差值
>>>from scipy.integrate import quad >>>import numpy as np >>>f = lambda x:np.exp(x**2) >>>res = quad(f,-5,5) >>>print("积分值:{}".format(res[0]),"绝对误差值:{}".format(res[1])) 积分值:14708307495.674295 绝对误差值:0.8040450761960138
2)dblquad(<f>,<a>,<b>,<gfun>,<hfun>)
- 求函数f(x,y)的二重积分。
- <a>,<b>分别是x函数的上限和下限。
- <gfun>,<hfun>分别是y函数的上限和下限函数。
>>>from scipy.integrate import dblquad >>>import numpy as np >>>import math >>>f = lambda x,y:x*y >>>g = lambda x:0 >>>h = lambda y:math.sqrt(y**2) >>>res = dblquad(f,-5,5,g,h) >>>print(res) (0.0, 1.7347526424764603e-12)
3) tplquad()和nquad()
- 与1)、2)相似,分别用于计算三重积分和多重积分。
7. interpolate模块
- interpolate模块可以根据一系列点生成拟合函数,即插值。
1)interp1d(<x>,<y>,<kind>)
- 根据一系列的点(x,y),生成拟合函数。
- <kind>表示插值方式,包含以下类型:
类型 含义 neareat 最邻近插值法 zero 阶梯插值 slinear、linear 线性插值 quadratic、cubic 2、3阶B样条曲线插值 >>>from scipy import interpolate >>>import numpy as np >>>import matplotlib.pyplot as plt >>># 生成一系列点 >>>x = np.linspace(0,5,10) >>>y = np.sin(x) >>># 生成拟合函数 >>>f = interpolate.interp1d(x,y,kind="linear") >>>x1 = np.linspace(0,5,30) >>># 输出结果 >>>plt.plot(x,y,'o',x1,f(x1),'-') >>>plt.legend(['data','linear'],loc='best') >>>plt.show()
2)UnivariateSpline(<x>,<y>,<s=0>)
- 对含有噪声的数值进行插值运算。
- s表示平滑参数。
>>>from scipy import interpolate >>>import numpy as np >>>import matplotlib.pyplot as plt >>># 生成一系列带噪声点 >>>x = np.linspace(0,5,10) >>>y = np.sin(x)+ 0.1*np.random.randn(10) # 通过随机值增加噪声 >>>plt.plot(x,y,'ro',ms=5) >>># 生成函数 >>>sp = interpolate.UnivariateSpline(x,y,s=5) >>>x1 = np.linspace(0,5,1000) >>>plt.plot(x1,sp(x1),'g',lw=3) >>>plt.legend(['data','linear'],loc='best') >>>plt.show()
8. linalg模块
- 包含线性代数的相关工具。
- scipy.linalg模块包含numpy.linalg模块中的全部功能,还有一些numpy.linalg中没有的高级功能。
1)slove(<a>,<b>)
- 用于解线性方程。
- <a>数组表示系数数组,<b>数组表示等号右侧值。
- 返回值是一个数组。
>>>from scipy import linalg >>>import numpy as np >>>""" >>>解方程组: >>> 2x+3y+4z = 20 >>> x+6y+7z = 14 >>> 5x+y+10z = 30 >>>""" >>># 获得数组 >>>a = np.array([[2,3,4],[1,6,7],[5,1,10]]) >>>b = np.array([20,14,30]) >>># 求解 >>>res = linalg.solve(a,b) >>>print(res) [ 9.32307692 3.07692308 -1.96923077]
2)det(<A>)
- 接受一个矩阵,返回矩阵的行列式值。
>>>from scipy import linalg >>>import numpy as np >>>a = np.array([[2,3,4],[1,6,7],[5,1,10]]) >>>res = linalg.det(a) >>>print(res) 65.0
3)eig(<A>)
- 接受一个矩阵,返回矩阵的特征值与特征向量。
>>>from scipy import linalg >>>import numpy as np >>>a = np.array([[2,3,4],[1,6,7],[5,1,10]]) >>>l,v = linalg.eig(a) >>>print('特征值:{}'.format(l)) >>>print('特征向量:{}'.format(v)) 特征值:[13.86697005+0.j 2.06651498+0.64568824j 2.06651498-0.64568824j] 特征向量:[[-0.38576969+0.j -0.56961344+0.19858249j -0.56961344-0.19858249j] [-0.64017262+0.j -0.65347247+0.j -0.65347247-0.j ] [-0.66434988+0.j 0.4485768 -0.088646j 0.4485768 +0.088646j ]]
4)svd(<A>)
- 接受一个矩阵,将矩阵转置并返回奇异值。
- 返回三个值:
值 含义 左奇异向量(A的转置矩阵,MxM) 奇异值(一个MxN的矩阵,除了对角线的元素外,其它都是0) 右奇异向量(A的转置矩阵,NxN) >>>from scipy import linalg >>>import numpy as np >>>a = np.array([[2,3,4],[1,6,7],[5,1,10]]) >>>U,s,Vh = linalg.svd(a) >>>print("原矩阵:{}\n".format(a)) >>>print("U:{}\n".format(U)) >>>print("s:{}\n".format(s)) >>>print("Vh:{}\n".format(Vh)) 原矩阵:[[ 2 3 4] [ 1 6 7] [ 5 1 10]] U:[[-0.35562115 -0.19756122 -0.91351144] [-0.58360352 -0.71649964 0.38214551] [-0.73002776 0.66902752 0.13950501]] s:[14.71637294 4.85816804 0.90915941] Vh:[[-0.33601925 -0.360042 -0.87032225] [ 0.45974439 -0.86918649 0.18207126] [-0.82202564 -0.33894632 0.45759068]]
9. optimize模块
- 包含常用数值优化的算法。
1)fmin_bfgs(<f>,<x0>)
- 标量函数极值求解。
- <f>是求值的函数,<x0>是梯度下降的初始值。
- 返回函数最小值的x值,如果有局部最小值,会返回局部最小值。
>>>from scipy.optimize import fmin_bfgs >>>import numpy as np >>>import matplotlib.pyplot as plt ''' 求函数: f(x) = x^2 + 2x + 1的极小值 ''' >>># 函数 >>>def f(x): >>> return (x**2 + 2*x + 1) >>>x = np.arange(-5,5,0.1) >>># 画出曲线 >>>plt.plot(x,f(x)) >>># 返回极小值 >>>x_cord = fmin_bfgs(f,0) >>>x_min = x_cord[0] >>>y_min = f(x_min) >>># 画出点 >>>plt.scatter(x_min,y_min,s=20,c='b') >>>plt.show() Optimization terminated successfully. Current function value: 0.000000 Iterations: 2 Function evaluations: 9 Gradient evaluations: 3
2)basinhopping(<f>,<x0>)
- 标量函数极值求解。
- 返回函数全局最小值的x值。
- 比fmin_bfgs()消耗更多资源,但不会返回局部最小值。
>>>from scipy.optimize import basinhopping >>>import numpy as np >>>import matplotlib.pyplot as plt ''' 求函数: f(x) = x**2 + 10*cos(x)的极小值 ''' >>># 函数 >>>def f(x): >>> return (x**2 + 10*np.cos(x)) >>>x = np.arange(-5,5,0.1) >>># 画出曲线 >>>plt.plot(x,f(x)) >>># 返回极小值 >>>x_cord = basinhopping(f,0) >>>print(x_cord) >>>x_min = x_cord.x[0] >>>y_min = f(x_min) >>># 画出点 >>>plt.scatter(x_min,y_min,s=20,c='b') >>>plt.show() fun: -1.8089833418214676 lowest_optimization_result: fun: -1.8089833418214676 hess_inv: array([[0.09479589]]) jac: array([1.78813934e-07]) message: 'Optimization terminated successfully.' nfev: 18 nit: 4 njev: 6 status: 0 success: True x: array([2.59573908]) message: ['requested number of basinhopping iterations completed successfully'] minimization_failures: 0 nfev: 1650 nit: 100 njev: 550 x: array([2.59573908])
3)brute(<f>,<x0>)
- 函数蛮力法,与basinhopping()类似,但效率极低。
>>>from scipy.optimize import brute >>>import numpy as np >>>import matplotlib.pyplot as plt ''' 求函数: f(x) = x**2 + 10*cos(x)的极小值 ''' >>># 函数 >>>def f(x): >>> return (x**2 + 10*np.cos(x)) >>>x = np.arange(-5,5,0.1) >>># 画出曲线 >>>plt.plot(x,f(x)) >>># 返回极小值 >>>r = slice(-np.pi/2, np.pi/2, np.pi/200) >>>x_cord = brute(f,(r,)) >>>print(x_cord) >>>x_min = x_cord[0] >>>y_min = f(x_min) >>># 画出点 >>>plt.scatter(x_min,y_min,s=20,c='b') >>>plt.show() [-2.59572559]
4)fminbound(<f>,<x1>,<x2>)
- 取一定范围内的函数最小值。
- <x1>和<x2>是范围边界。
>>>from scipy.optimize import fminbound >>>import numpy as np >>>import matplotlib.pyplot as plt ''' 求函数: f(x) = x**2 + 10*cos(x)在π/2和3π/4之间的极小值 ''' >>># 函数 >>>def f(x): >>> return (x**2 + 10*np.cos(x)) >>>x = np.arange(-5,5,0.1) >>># 画出曲线 >>>plt.plot(x,f(x)) >>># 返回极小值 >>>x_min = fminbound(f,np.pi/2,3/4*np.pi) >>>y_min = f(x_min) >>># 画出点 >>>plt.scatter(x_min,y_min,s=20,c='b') >>>plt.show()
5)fsolve(<f>,<x0>)
- 函数求解,返回函数的根值。
>>>from scipy.optimize import fsolve >>>import numpy as np ''' 求一元函数函数: f(x) = x**2 + 10*cos(x)的解 ''' >>># 函数 >>>def f(x): >>> return (x**2 + 10*np.cos(x)) >>>res = fsolve(f,1) >>>print(res) [1.96887294] ''' 求解方程组: f1(x+2y) = 0 f2(y-4)= 0 ''' >>>def f(x): >>> return [ >>> x[0]+2*x[1], >>> x[1]-4 >>> ] >>>res = fsolve(f,[1,1]) >>>print(res) [-8. 4.]
6)curve_fit(<f>,<x1>,<y1>)
- 为函数<f>创建拟合曲线。
- <x1>,<y1>为样本数组
- 返回曲线的系数和协方差。
>>>from scipy.optimize import curve_fit >>>import numpy as np >>>import matplotlib.pyplot as plt ''' 根据函数生成数据: f(x) = x**2 + 10*cos(x) ''' >>># 函数 >>>def f(x, a, b): >>> return a*np.sin(x) + b >>># 制作样本数据 >>>x_data = np.linspace(-10,10,10) >>>y_data = f(x_data, 10, 1) + np.random.randn(x_data.size)# 加入噪声 >>># 生成曲线 >>>variables,variables_covariance = curve_fit(f,x_data,y_data) >>>print("系数:{}".format(variables)) >>>print("协方差:{}".format(variables_covariance)) 系数:[10.48927209 0.77088139] 协方差:[[ 8.79371473e-02 -9.99394876e-11] [-9.99394876e-11 4.52348670e-02]]
7)leastsq(<f>,<x0>,<args=()>)
- 用最小二乘拟合法获得最符合函数<f>的曲线。
- <x0>表示初始参数值。
- <args>表示函数的其他参数。
>>>from scipy.optimize import leastsq >>>import numpy as np >>>import matplotlib.pyplot as plt >>># 创建数据 >>>a = np.arange(0,100,5) >>>b = np.array([0,5,14,24,34,36,41,43,47,53,56,61,63,65,71,75,76.80,85,95,100]) >>># 创建函数 >>>def f(x): >>> x1,x2 = x >>> return b-(x1*a+x2) >>>res = leastsq(f,[1,10]) >>>k,p = res[0] >>>print(k,p) >>># 画图 >>>plt.figure(figsize=(8,6)) >>>plt.scatter(a,b,color="green",label="Samples",linewidth=2) >>>x = np.linspace(0,100,100) >>>y = k*x +p >>>plt.plot(x,y,color="red",label="fit",linewidth=2) >>>plt.legend() >>>plt.show() 0.9414135338344587 7.522857142851741
10. signal模块
- 包含信号处理的工具。
1)resample(<singal>,<num>)
- 使用FFT将信号<signal>重采样成<num>个点。
>>>import numpy as np >>>import matplotlib.pyplot as plt >>>from scipy.signal import resample >>>t = np.linspace(0,5,100) >>>sig = np.cos(t) >>>sig_res = resample(sig,25) >>>plt.plot(t,sig) >>>plt.plot(t[::4],sig_res,'ko',color="blue") >>>plt.show()
2)detrend(<singal>)
- 从信号中去除线性趋势。
>>>import numpy as np >>>import matplotlib.pyplot as plt >>>from scipy.signal import detrend >>>t = np.linspace(0,5,100) >>>sig = t + np.random.normal(size=100) # 正态分布 >>>sig_det = detrend(sig) >>>plt.plot(t,sig) >>>plt.plot(t,sig_det) >>>plt.show()
3)medfilt(<singal>,<kernel_size=[]>)
- 返回信号的中值滤波。
>>>import numpy as np >>>import matplotlib.pyplot as plt >>>from scipy.signal import medfilt >>>t = np.linspace(0,5,100) >>>sig = t + np.random.normal(size=100) >>>sig_filt = medfilt(sig) >>>plt.plot(t,sig) >>>plt.plot(t,sig_filt) >>>plt.show()
4)wiener(<singal>,<mysize=0>,<noise=0.0>)
- 返回信号的维纳滤波。
>>>import numpy as np >>>import matplotlib.pyplot as plt >>>from scipy.signal import wiener >>>t = np.linspace(0,5,100) >>>sig = t + np.random.normal(size=100) >>>sig_filt = medfilt(sig) >>>plt.plot(t,sig) >>>plt.plot(t,sig_filt) >>>plt.show()
5)spectrogram(<singal>)
- 用于计算连续时间窗上的频谱图。
>>>import numpy as np >>>import matplotlib.pyplot as plt >>>from scipy.signal import spectrogram >>>t = np.linspace(0,5,100) >>>sig = t + np.random.normal(size=100) >>>frequencies, times, spectrogram = spectrogram(sig) >>>plt.figure(figsize=(5, 4)) >>>plt.imshow(spectrogram, aspect='auto', cmap='hot_r', origin='lower') >>>plt.title('Spectrogram') >>>plt.ylabel('Frequency band') >>>plt.xlabel('Time window') >>>plt.tight_layout()
6)welch(<singal>)
- 用于计算功率谱密度(PSD)
>>>import numpy as np >>>import matplotlib.pyplot as plt >>>from scipy.signal import welch >>>t = np.linspace(0,5,100) >>>sig = t + np.random.normal(size=100) >>>f, Pxx_den = welch(sig, 10e3, nperseg=1024) >>>plt.semilogy(f, Pxx_den) >>>plt.ylim([0.5e-5, 1]) >>>plt.xlabel('frequency [Hz]') >>>plt.ylabel('PSD [V**2/Hz]') >>>plt.show()
11. stats模块
- stats模块包含了统计工具以及概率分析工具。
1)norm.rvs(<vars>,<size>)
- 对随机变量进行随机取值,通过size参数指定输出数组的大小。
>>>import numpy as np >>>from scipy.stats import norm >>>data = np.random.normal(size=10) >>>rvs = norm.rvs(data,size=(10)) >>>print(rvs) [-0.56467832 0.4045045 1.292464 0.70494959 -1.42089047 1.5621374 2.33538589 0.96448403 1.47154236 -2.76150784]
2)norm.pdf(<vars>)
- 返回随机变量的概率密度函数(pdf)。
- scipy.stats.norm是一个分布对象。
>>>import matplotlib.pyplot as plt >>>import numpy as np >>>from scipy.stats import norm >>>data = np.random.normal(size=1000) >>>bins = np.arange(-4,5) >>>histogram = np.histogram(data,bins=bins)[0] >>>pdf = norm.pdf(bins) # norm是分布对象 >>>plt.plot(bins[1:],histogram) >>>plt.plot(bins,pdf) >>>plt.show()
3)norm.cdf(<vars>)
- 返回随机变量概率密度函数的积分,即累积分布函数。
>>>import numpy as np >>>from scipy.stats import norm >>>data = np.random.normal(size=10) >>>cdf = norm.cdf(data) >>>print(cdf) [0.43952227 0.37823611 0.01230109 0.40342344 0.72891795 0.38516675 0.32259791 0.10956863 0.49424769 0.58740197]
4)norm.sf(<vars>)
- 返回随机变量的生存函数。(1-cdf(t))
>>>import numpy as np >>>from scipy.stats import norm >>>data = np.random.normal(size=10) >>>sf = norm.sf(data) >>>print(sf) [0.77566025 0.1372217 0.68752621 0.11581949 0.53617876 0.39929989 0.7829109 0.95804058 0.04106034 0.46006557]
5)norm.ppf(<vars>)
- 返回累积分布函数的反函数。
>>>import numpy as np >>>from scipy.stats import norm >>>data = np.random.normal(size=10) >>>ppf = norm.ppf(data) >>>print(ppf) [ nan nan 1.18416881 0.77447655 -0.83857477 -0.23735722 0.60992256 -2.12845591 nan nan]
6)norm.stat(<vars>)
- 计算随机变量的参数。
>>>import numpy as np >>>from scipy.stats import norm >>>data = np.random.normal(size=10) >>>mean,var,skew,kurt = norm.stats(data,moments='mvsk') >>>print("平均值",mean) >>>print("方差:",var) >>>print("偏态:",skew) >>>print("峰态:",kurt) 平均值 [-1.33302437 0.17052003 -0.27983462 0.41925024 1.09372163 -0.50300475 -0.83467595 0.58259444 -1.38216973 0.28355613] 方差: [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] 偏态: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 峰态: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
7)norm.fit(<vars>)
- 对一组随机取样进行拟合,找出最适合取样数据的概率密度函数的系数。
>>>import numpy as np >>>from scipy.stats import norm >>>data = np.random.normal(size=10) >>>mu,sigma = norm.fit(data) >>>print("期望值:",mu) >>>print("标准差:",sigma) 期望值: 0.33074099749118446 标准差: 0.9540964123033218
8)rv.discrete(<values=(x,p)>)
- 获得离散概率的分布。
- x表示样本空间,p表示样本的概率。
>>>from scipy.stats import rv_discrete >>># 筛子的概率分布 >>>x = range(1,7) >>>p = (0.4, 0.2, 0.1, 0.1, 0.1, 0.1) >>>dice = rv_discrete(values=(x, p)) >>>print(dice.rvs(size=10))# 投10次的分布 [2 6 4 3 2 2 3 1 1 4]
9)geom(<k>)
- 生成几何分布。
- <k>是几何分布参数。
>>>from scipy.stats import geom >>># 筛子的概率分布 >>>p = 0.5 >>>dist = geom(p) >>>x = np.linspace(0,6,5) >>>pmf = dist.pmf(x) >>>cdf = dist.cdf(x) >>>samples = dist.rvs(10) >>>print("概率质量函数:",pmf) >>>print("累积分布函数:",cdf) >>>print(samples) 概率质量函数: [0. 0. 0.125 0. 0.015625] 累积分布函数: [0. 0.5 0.875 0.9375 0.984375] [4 2 5 1 1 2 2 4 2 3]
10)kstest(<sample>,<k>)
- 检验样本分布的拟合度(Kolmogorov-Smirnov检验)。
>>>import numpy as np >>>from scipy.stats import kstest >>>sample = np.random.randn(100) >>>d,t_value = kstest(sample,'norm') >>>print("d:",d) >>>print("t_value:",t_value) d: 0.054675325982248446 t_value: 0.92604014256369
11)normaltest(<sample>)
- 检验样本分布的正态分布拟合度。
>>>import numpy as np >>>from scipy.stats import normaltest >>>sample = np.random.randn(100) >>>z,p = normaltest(sample) >>>print("z-score:",z) >>>print("p-value:",p) z-score: 0.6613838959589525 p-value: 0.7184264476749593
12)描述函数
函数 含义 hmean 调和平均数 tmean -1到1之间的样本均值 skew 偏度 describe 样本的多种描述统计结果 >>>import numpy as np >>>from scipy.stats import * >>>sample = np.random.randn(100) >>>res = hmean(sample[sample > 0]) >>>print('调和平均数:',res) >>>res = tmean(sample, limits=(-1, 1)) >>>print('样本均值:',res) >>>res = skew(sample) >>>print('样本偏值 = ' ,res) >>>res = describe(sample) >>>print('样本量:',res[0]) >>>print('最小值:',res[1][0]) >>>print('最大值:',res[1][1]) >>>print('平均值:',res[2]) >>>print('方差:',res[3]) >>>print('偏值:',res[4]) >>>print('峰值:',res[5]) 调和平均数: 0.05340852599534427 样本均值: -0.08822566247105651 样本偏值 = 0.16918788340625485 样本量: 100 最小值: -2.242433436614096 最大值: 2.2075060817319594 平均值: -0.07481108493126812 方差: 0.9744617372056462 偏值: 0.16918788340625485 峰值: -0.4407854402834386
12. ndimage模块
- scipy.ndimage是图像处理模块,包括图像矩阵变换、图像滤波、图像卷积等功能。
1)rotate(<img>,<n>)
- 用于旋转图片<n>度。
>>>from scipy.ndimage import rotate >>>import matplotlib.image as mpimg >>>import matplotlib.pyplot as plt >>># 加载图片 >>>img = mpimg.imread('C://Users//xiaor//Desktop//qq.jpg') >>># 旋转图片 >>>rot_img = rotate(img,120) >>># 显示图片 >>>plt.imshow(rot_img) >>>plt.show()
2)gaussian_filter(<img>,<sigma>,)
- 通过高斯滤波位图像增加某些特性(平滑、锐化、边缘增强等)。
- <sigma>表示模糊度。
>>>from scipy.ndimage import gaussian_filter >>>import matplotlib.image as mpimg >>>import matplotlib.pyplot as plt >>># 加载图片 >>>img = mpimg.imread('C://Users//xiaor//Desktop//qq.jpg') >>># 处理图片 >>>img_modi = gaussian_filter(img, sigma=2) >>>plt.imshow(img_modi) >>>plt.show()
3)边缘检测
- 用于检测图片的边缘。
- 常用的边缘检测算法包括:Sobel()、Canny()、Prewitt()、Roberts()、Fuzzy Logic methods()等。
>>>from scipy.ndimage import sobel,gaussian_filter >>>import matplotlib.image as mpimg >>>import matplotlib.pyplot as plt >>>import numpy as np >>># 加载图片 >>>img = mpimg.imread('C://Users//xiaor//Desktop//qq.jpg') >>>img = gaussian_filter(img,15) >>># 处理图片 >>>sx = sobel(img,axis=0,mode='constant') >>>plt.imshow(sx) >>>plt.show()
13. io模块
- 包含输入和输出功能的模块。
1)savemat(<file>,<data>)
- 将<data>写入MATLAB文件。
>>>from scipy.io import savemat >>>import numpy as np >>>import os >>>n = np.array([1,2,3]) >>>file = savemat('data.mat',{'n':n}) >>>print([x for x in os.listdir("C:\\Users\\xiaor\\") if x.endswith(".mat")]) ['data.mat']
2)loadmat(<file>)
- 读取MATLAB文件。
>>>from scipy.io import loadmat >>>import numpy as np >>>import os >>>file = loadmat('data.mat') >>>print(file['n']) [[1 2 3]]
3)whosmat(<file>)
- 列出MATLAB文件中的变量, 可以在不加载文件的情况下查看文件概要内容。
>>>from scipy.io import whosmat >>>import numpy as np >>>file = whosmat('data.mat') >>>print(file) [('n', (1, 3), 'int32')]
参考资料
- numpy包的应用 作者:你们都厉害
- 理解numpy的rollaxis与swapaxes函数 作者:liaoyuecai
- Python机器学习及分析工具:Scipy篇 作者:殉道者之花火
- 奇客谷 作者: 吴吃辣
- 统计stats模块 作者: 火锅侠
网友评论