『Numpy学习指南』第十章_高端科学计算库scipy入门(系列完结)

时间:2023-01-09 22:52:20

简介:

scipy包包含致力于科学计算中常见问题的各个工具箱。它的不同子模块相应于不同的应用。像插值,积分,优化,图像处理,,特殊函数等等。

scipy可以与其它标准科学计算程序库进行比较,比如GSL(GNU C或C++科学计算库),或者Matlab工具箱。scipy是Python中科学计算程序的核心包;它用于有效地计算numpy矩阵,来让numpy和scipy协同工作。

在实现一个程序之前,值得检查下所需的数据处理方式是否已经在scipy中存在了。作为非专业程序员,科学家总是喜欢重新发明造*,导致了充满漏洞的,未经优化的,很难分享和维护的代码。相反,Scipy程序经过优化和测试,因此应该尽可能使用。

模块:

scipy 由一些特定功能的子模块组成:

 

模块  功能
scipy.cluster 矢量量化 / K-均值
scipy.constants 物理和数学常数
scipy.fftpack 傅里叶变换
scipy.integrate 积分程序
scipy.interpolate 插值
scipy.io 数据输入输出
scipy.linalg 线性代数程序
scipy.ndimage n维图像包
scipy.odr 正交距离回归
scipy.optimize 优化
scipy.signal 信号处理
scipy.sparse 稀疏矩阵
scipy.spatial 空间数据结构和算法
scipy.special 任何特殊数学函数
scipy.stats 统计

 

它们全依赖numpy,但是每个之间基本独立。导入Numpy和这些scipy模块的标准方式是:

1 import numpy as np
2 from scipy import stats # 其它子模块相同

主scipy命名空间大多包含真正的numpy函数(尝试 scipy.cos 就是 np.cos)。这些仅仅是由于历史原因,通常没有理由在你的代码中使用import scipy。

【注】:import scipy as sp 后sp.子模块 会失败,所以建议采用上文的 from import 方法。

介绍几个函数:

由于scipy包过于完备复杂,并且暂时看来我的需求也并不是特别急迫,所以简单的介绍几个我感觉蛮有意思的函数部分,以后在sklearn的机器学习中还会继续打交道的,所以,sp,接下来还请多多指教。

导入积分包,插值包

1 import numpy as np
2 import matplotlib.pyplot as plt
3 from scipy import integrate,interpolate

积分:

一维积分尝试:

integrate.quad(lambda x:np.exp(-x**2),-10,10):原函数,下限,上限

1 '''数值积分'''
2
3 # 专用包sciyp.intergrate
4
5 print(integrate.quad(lambda x:np.exp(-x**2),-10,10))

二维积分:

1 def half_circle(x):
2 return (1-x**2)**0.5
3 def half_sphere(x, y):
4 return (1-x**2-y**2)**0.5
5 res = integrate.dblquad(half_sphere, -1, 1, # 原函数,x下限,y下限
6 lambda x:-half_circle(x), # y积分区域下限
7 lambda x:half_circle(x)) # y积分区域上限
8 print(res[0])

尝试绘张图:

1 import matplotlib.pyplot as plt
2 from mpl_toolkits.mplot3d import Axes3D
3 u = np.linspace(-1,1,100)
4 x,y = np.meshgrid(u,u) # 网格坐标生成函数
5 z = np.abs((1-x**2-y**2))**0.5
6 fig = plt.figure()
7 ax = Axes3D(fig)
8 ax.plot_surface(x,y,z,rstride=4,cstride=4,cmap='rainbow')
9 plt.show()

『Numpy学习指南』第十章_高端科学计算库scipy入门(系列完结)

 

插值:

interpolate.interp1d(x,signal)

interpolate.interp1d(x,signal,kind='cubic')

 1 '''插值'''
2
3 # 创建信号
4 x = np.linspace(-18,18,36)
5 noise = 0.1*np.random.random(len(x))
6 signal = np.sinc(x) + noise
7
8 # 生成一次插值函数
9 interpreted = interpolate.interp1d(x,signal) #<---------
10 x2 = np.linspace(-18,18,180)
11 y = interpreted(x2)
12
13 # 生成三次插值函数
14 cubic = interpolate.interp1d(x,signal,kind='cubic') #<---------
15 y2 = cubic(x2)
16
17 plt.plot(x,signal,marker='o',label='data')
18 plt.plot(x2,y,linestyle='-',label='linear')
19 plt.plot(x2,y2,'-',lw=2,label='cubic')
20 plt.legend()
21 plt.show()

 

『Numpy学习指南』第十章_高端科学计算库scipy入门(系列完结)

 

小结:

对于本书(《NumPy学习指南》)的学习到此就告一段落了,由于numpy对于python的特殊地位,对于她的熟悉学习过程必然会伴随我剩余人生相当长的一部分,所以也没什么伤感的,只是新坑已经准备好了,准备继续大干一场。中二一次,在这用魔兽过往版本的一句转场结束系列:燃烧的远征仍将继续,而我们将踏着灰烬前行!