插值被定义为在直线或曲线上两点之间找到一个值。单词的第一部分 "inter" 意味着 "进入",这提示我们要查看数据内部。换句话说,"在精确数据点之间估计中间值称为插值"。在统计学、科学和商业中,或者当需要预测存在于两个现有数据点之间的值时,插值非常有用。

让我们看看如何使用 scipy.interpolation 包进行插值。

import numpy as np  
from scipy import interpolate  
import matplotlib.pyplot as plt  
x = np.linspace(0, 5, 10)   
y = np.cos(x**2/3+4)  
print(x,y)  

这将以数组形式给出以下输出。np.linspace() 函数返回给定数字之间的间隔。

输出:

[0.        0.55555556 1.11111111 1.66666667 2.22222222 2.77777778
 3.33333333 3.88888889 4.44444444 5.] 
[-0.65364362 -0.57246439 -0.29634775  0.21191783  0.80382736  0.95857746
  0.14971294 -0.92731369 -0.39972072  0.97296947]

我们可以将这些数组作为空间中两点的二维绘制,考虑以下示例:

import numpy as np  
from scipy import interpolate  
import matplotlib.pyplot as plt  
x = np.linspace(0, 5, 10)  
y = np.cos(x**2/3+4)  
plt.plot(x,y,'r')  
plt.show()  

输出:

8-1.png

一维插值

scipy.interpolation 提供 interp1d 类,这是一种基于固定数据点创建函数的有用方法。

通过使用上述数据,创建一个插值函数并绘制一个新的插值图。

import numpy as np  
from scipy.interpolate import interp1d  
import matplotlib.pyplot as plt  
fun1 = interp1d(x, y,kind = 'linear')  
fun2 = interp1d(x, y, kind = 'cubic')  
xnew = np.linspace(0, 4,30)  
plt.plot(x, y, 'o', xnew, fun1(xnew), '-', xnew, fun2(xnew), '--')  
plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')  
plt.show()  

输出:

8-2.png

在上述程序中,我们创建了两个函数 fun1 和 fun2。变量 x 包含样本点,变量 y 包含相应的值。第三个变量 kind 表示插值技术的类型。有多种插值方法。这些方法包括:

  • 线性
  • 最近邻
  • S-线性
  • 二次
  • 三次

样条

样条是用于通过指定的一组点生成平滑曲线的柔性带。样条插值需要两个基本步骤。在第一步中,计算曲线的样条表示;在第二步中,在所需点评估样条。

8-3.png

有两种方法表示曲线。首先,直接样条方法使用函数 splrep() 在二维平面上找到曲线的样条表示。默认的样条顺序是三次的,但可以通过输入关键字 k 进行更改。

splprep() 允许我们在 N 维空间中 参数化 定义曲线。关键字参数用于指定在样条拟合期间执行的平滑量。

标准输出是一个三元组 (t, c, k),其中 t 表示结点,c 表示系数,k 表示样条的阶。

单变量样条

scipy.interpolate 提供 UnivariateSpline 类,这是一种基于固定数据点创建函数的合适方法。语法如下:

scipy.interpolate.UnivariateSpline(x, y, w = None, bbox = [None, None], k = 3, s = None, ext = 0, check_finite = False).  

参数-

w- 指定用于样条拟合的权重。必须是正的。

s- 通过指定平滑条件来指定结点(点)的数量。

k- 表示平滑样条的度数。必须满足 k <= 5。默认情况下,k = 3,即三次样条。

  • Ext

    • 控制由结点序列定义的间隔外元素的外推模式。
    • 如果 ext = 0 或 'extrapolate',返回外推值。
    • 如果 ext = 1 或 'zero',返回 0
    • 如果 ext = 2 或 'raise',引发 ValueError
    • 如果 ext = 3 或 'const',返回边界值。
  • check_finite - 检查输入数组是否只包含有限数。

考虑以下示例:

import matplotlib.pyplot as plt  
import numpy as np  
from scipy.interpolate import UnivariateSpline  
x = np.linspace(-3, 3,50)  
y = np.exp(-x**2) + 0.1 * np.random.randn(50)  
plt.plot(x, y, 'ro', ms = 5)  
plt.show()  

输出:

8-4.png

标签: Scipy, Scipy学习, Scipy教程, Scipy下载, Scipy指南, Scipy基础教程, Scipy使用指南, Scipy库, Scipy入门, Scipy进阶, Scipy模块, Scipy安装教程