SciPy插值 SciPy集成 SciPy输入和输出 在本章中,我们将讨论插值如何帮助SciPy。 插值是什么? 插值是在直线或曲线上的两点之间找到值的过程。为了帮助我们记住它的含义,我们应该将“inter”这个词的第一部分想象为“输入”,这意味着我们要查看原来数据的“内部”。这种插值工具不仅适用于统计学,而且在科学,商业或需要预测两个现有数据点内的值时也很有用。 让我们创建一些数据,看看如何使用 scipy.interpolate 包进行插值。 import numpy as np from scipy import interpolate import matplotlib.pyplot as plt x = np.linspace(0, 4, 12) y = np.cos(x**2/3+4) print x,y 上述程序将生成以下输出。 ( array([0., 0.36363636, 0.72727273, 1.09090909, 1.45454545, 1.81818182, 2.18181818, 2.54545455, 2.90909091, 3.27272727, 3.63636364, 4.]), array([-0.65364362, -0.61966189, -0.51077021, -0.31047698, -0.00715476, 0.37976236, 0.76715099, 0.99239518, 0.85886263, 0.27994201, -0.52586509, -0.99582185]) ) 现在,我们有两个数组。假设这两个数组作为空间中点的两个维度,让我们使用下面的程序进行绘图,并看看它们的样子。 plt.plot(x, y,’o’) plt.show() 上述程序将生成以下输出。 一维插值 scipy.interpolate中的interp1d类是基于固定数据点创建函数的一种便捷方法,可以使用线性插值在给定数据定义的域内的任意位置评估该函数。 通过使用上述数据,让我们创建一个插值函数并绘制一个新的插值图。 f1 = interp1d(x, y,kind = 'linear') f2 = interp1d(x, y, kind = 'cubic') 使用interp1d函数,我们创建了两个函数f1和f2。这些函数对于给定的输入x返回y。第三种变量类型表示插值技术的类型。'线性','最近','零','线性','二次','立方'是一些插值技术。 现在,让我们创建更多长度的新输入以查看插值的明显区别。我们将对新数据使用旧数据的相同功能。 xnew = np.linspace(0, 4,30) plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--') plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best') plt.show() 上述程序将生成以下输出。 样条曲线 为了通过数据点画出平滑的曲线,绘图员曾经使用薄的柔性木条,硬橡胶,金属或塑料称为机械样条。为了使用机械花键,在设计中沿着曲线明确选择了一些销钉,然后将花键弯曲,以便它们接触到每个销钉。 显然,在这种结构下,样条曲线在这些引脚上插入曲线。它可以用来在其他图纸中重现曲线。引脚所在的点称为结。我们可以通过调整结点的位置来改变样条线所定义的曲线的形状。 单变量样条 一维平滑样条拟合一组给定的数据点。scipy.interpolate中的UnivariateSpline类是创建基于固定数据点类的便捷方法 - scipy.interpolate.UnivariateSpline(x,y,w = None,bbox = [None,None],k = 3,s = None,ext = 0,check_finite = False)。 参数 - 以下是单变量样条曲线的参数。 这适合度k的样条y = spl(x)到所提供的x,y数据。 'w' - 指定样条拟合的权重。必须是积极的。如果没有(默认),权重都相等。 's' - 通过指定平滑条件来指定节点的数量。 'k' - 平滑样条的程度。必须<= 5.默认值为k = 3,一个三次样条。 Ext - 控制不在由结点序列定义的区间中的元素的外插模式。 如果ext = 0或'extrapolate',则返回外推值。 如果ext = 1或'零',则返回0 如果ext = 2或'raise',则引发ValueError 如果'const'的ext = 3返回边界值。 check_finite - 是否检查输入数组是否只包含有限数字。 让我们考虑下面的例子。 import matplotlib.pyplot as plt 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() 使用平滑参数的默认值。 spl = UnivariateSpline(x, y) xs = np.linspace(-3, 3, 1000) plt.plot(xs, spl(xs), 'g', lw = 3) plt.show() 手动更改平滑量。 spl.set_smoothing_factor(0.5) plt.plot(xs, spl(xs), 'b', lw = 3) plt.show() SciPy集成 SciPy输入和输出