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