scipy库详解

Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。

Scipy 由不同科学计算领域的子模块组成:

子模块描述
cluster聚类算法
constants物理数学常数
fftpack快速傅里叶变换
integrate积分和常微分方程求解
interpolate插值
io输入输出
linalg线性代数
odr正交距离回归
optimize优化和求根
signal信号处理
sparse稀疏矩阵
spatial空间数据结构和算法
special特殊方程
stats统计分布和函数
weaveC/C++ 积分

在使用 Scipy 之前,为了方便,假定这些基础的模块已经被导入:


   
   
  1. import numpy as np
  2. import scipy as sp
  3. import matplotlib as mpl
  4. import matplotlib.pyplot as plt

由于 ScipyNumpy 为基础,因此很多基础的 Numpy 函数可以在scipy 命名空间中直接调用

1.插值

样条插值法是一种以可变样条来作出一条经过一系列点的光滑曲线的数学方法


   
   
  1. from scipy.interpolate import interp1d
  2. np.set_printoptions(precision= 2, suppress= True) #设置 Numpy 浮点数显示格式
  3. #从文本中读入数据
  4. data = np.genfromtxt( "JANAF_CH4.txt",
  5. delimiter= "\t", # TAB 分隔
  6. skiprows= 1, # 忽略首行
  7. names= True, # 读入属性
  8. missing_values= "INFINITE", # 缺失值
  9. filling_values=np.inf) # 填充缺失值
  10. ch4_cp = interp1d(data[ 'TK'], data[ 'Cp']) #默认情况下,输入值要在插值允许的范围内,否则插值会报错

我们可以通过 kind 参数来调节使用的插值方法,来得到不同的结果:

  • nearest 最近邻插值
  • zero 0阶插值
  • linear 线性插值
  • quadratic 二次插值
  • cubic 三次插值
  • 4,5,6,7 更高阶插值

对于径向基函数,其插值的公式为:

njφ(|xxj|)∑njφ(|x−xj|)

查看具体数值:


   
   
  1. integrate(y, (theta, 0, sympy.pi)) .evalf()
  2. integrate(y, (theta, 0, np.pi))

(2)数值积分

导入贝塞尔函数


   
   
  1. from scipy.special import jv
  2. def f( x):
  3. return jv( 2.5, x)

积分到无穷


   
   
  1. from numpy import inf
  2. interval = [ 0., inf]
  3. def g( x):
  4. return np.exp(-x ** 1/ 2)
  5. value, max_err = quad(g, *interval)
  6. x = np.linspace( 0, 10, 50)
  7. fig = plt.figure(figsize=( 10, 3))
  8. p = plt.plot(x, g(x), 'k-')
  9. p = plt.fill_between(x, g(x))
  10. plt.annotate( r"$\int_0^{\infty}e^{-x^1/2}dx = $" + "{}". format(value), ( 4, 0.6),
  11. fontsize= 16)
  12. print "upper bound on error: {:.1e}". format(max_err)

6.解微分方程

(1)简单一阶:


   
   
  1. from scipy.integrate import odeint
  2. def dy_dt( y, t):
  3. return np.sin(t)
  4. t = np.linspace( 0, 2*pi, 100)
  5. result = odeint(dy_dt, 0, t)
  6. fig = figure(figsize=( 12, 4))
  7. p = plot(t, result, "rx", label= r"$\int_{0}^{x}sin(t) dt $")
  8. p = plot(t, -cos(t) + cos( 0), label= r"$cos(0) - cos(t)$")
  9. p = plot(t, dy_dt( 0, t), "g-", label= r"$\frac{dy}{dt}(t)$")
  10. l = legend(loc= "upper right")
  11. xl = xlabel( "t")

(2)高阶微分方程:


   
   
  1. def dy_dt( y, t):
  2. """Governing equations for projectile motion with drag.
  3. y[0] = position
  4. y[1] = velocity
  5. g = gravity (m/s2)
  6. D = drag (1/s) = force/velocity
  7. m = mass (kg)
  8. """
  9. g = - 9.8
  10. D = 0.1
  11. m = 0.15
  12. dy1 = g - (D/m) * y[ 1]
  13. dy0 = y[ 1] if y[ 0] >= 0 else 0.
  14. return [dy0, dy1]
  15. position_0 = 0.
  16. velocity_0 = 100
  17. t = linspace( 0, 12, 100)
  18. y = odeint(dy_dt, [position_0, velocity_0], t)
  19. p = plot(t, y[:, 0])
  20. yl = ylabel( "Height (m)")
  21. xl = xlabel( "Time (s)")

7.稀疏矩阵

稀疏矩阵主要使用 位置 + 值 的方法来存储矩阵的非零元素,根据存储和使用方式的不同,有如下几种类型的稀疏矩阵:

类型描述
bsr_matrix(arg1[, shape, dtype, copy, blocksize])Block Sparse Row matrix
coo_matrix(arg1[, shape, dtype, copy])A sparse matrix in COOrdinate format.
csc_matrix(arg1[, shape, dtype, copy])Compressed Sparse Column matrix
csr_matrix(arg1[, shape, dtype, copy])Compressed Sparse Row matrix
dia_matrix(arg1[, shape, dtype, copy])Sparse matrix with DIAgonal storage
dok_matrix(arg1[, shape, dtype, copy])Dictionary Of Keys based sparse matrix.
lil_matrix(arg1[, shape, dtype, copy])Row-based linked list sparse matrix

在这些存储格式中:

  • COO 格式在构建矩阵时比较高效
  • CSC 和 CSR 格式在乘法计算时比较高效

   
   
  1. from scipy.sparse import *
  2. import numpy as np
  3. coo_matrix(( 2, 3))
  4. #也可以使用一个已有的矩阵或数组或列表中创建新矩阵:
  5. A = coo_matrix([[ 1, 2, 0],[ 0, 0, 3],[ 4, 0, 5]])

(0, 0) 1 (0, 1) 2 (1, 2) 3 (2, 0) 4 (2, 2) 5

可以转化为普通矩阵:

C = A.todense()
   
   

matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])

还可以传入一个 (data, (row, col)) 的元组来构建稀疏矩阵:


   
   
  1. I = np.array([ 0,3,1,0])
  2. J = np.array([ 0,3,1,2])
  3. V = np.array([ 4,5,7,9])
  4. A = coo_matrix((V,(I,J)),shape =( 4,4))
  5. print A

(0, 0) 4 (3, 3) 5 (1, 1) 7 (0, 2) 9

8.线性代数


   
   
  1. import numpy as np
  2. import numpy.linalg
  3. import scipy as sp
  4. import scipy.linalg
  5. import matplotlib.pyplot as plt
  6. from scipy import linalg

scipy.linalg 包含 numpy.linalg 中的所有函数,同时还包含了很多 numpy.linalg 中没有的函数,在使用时,我们一般使用 scipy.linalg 而不是 numpy.linalg

(1)求解方程


   
   
  1. A = np.array([[ 1, 3, 5],
  2. [ 2, 5, 1],
  3. [ 2, 3, 8]])
  4. b = np.array([ 10, 8, 3])
  5. x = linalg.solve(A, b)

(2)计算行列式


   
   
  1. A = np.array([[ 1, 3, 5],
  2. [ 2, 5, 1],
  3. [ 2, 3, 8]])
  4. linalg.det(A)

(3)矩阵分解

对于给定的 N×NN×N 矩阵 AA,特征值和特征向量问题相当与寻找标量 λλ 和对应的向量 vv 使得:

 

Av=λvAv=λv

矩阵的 NN 个特征值(可能相同)可以通过计算特征方程的根得到:

 

|A−λI|=0|A−λI|=0

然后利用这些特征值求(归一化的)特征向量。

问题求解

  • linalg.eig(A)
    • 返回矩阵的特征值与特征向量
  • linalg.eigvals(A)
    • 返回矩阵的特征值
  • linalg.eig(A, B)
    • 求解 Av=λBvAv=λBv 的问题

(4)对稀疏矩阵

  • scipy.sparse.linalg.inv
    • 稀疏矩阵求逆
  • scipy.sparse.linalg.expm
    • 求稀疏矩阵的指数函数
  • scipy.sparse.linalg.norm
    • 稀疏矩阵求范数

对于特别大的矩阵,原来的方法可能需要太大的内存,考虑使用这两个方法替代:

  • scipy.sparse.linalg.eigs
    • 返回前 k 大的特征值和特征向量
  • scipy.sparse.linalg.svds
    • 返回前 k 大的奇异值和奇异向量

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DOT Manager

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值