python interpolate 用法_关于Python插件包SciPy interpolate的最新用法

何为插值?

在学习数值分析的时候常常用到一次插值,二次插值...。经过不断的学习和使用可以发现:插值是在直线或曲线上的两点之间找到值的一种处理过程。 为了更好地理解插值的意义,这里我们这样说:即依据一系列点 (x,y)通过一定的算法找到一个合适的函数来逼近这些点,反映出这些点的走势规律。当拟合出插值函数后便可用这个插值函数计算其他 x 对应的的 y值,这就是插值的意义所在。

数学演变:

image.png

目前常见的插值方法:

(1)多项式插值(常用的,如拉格朗日插值法);

(2)分段插值;(3)三角插值。

插值工具

SciPy interpolate插值工具不仅适用于统计学,而且在科学,商业或需要预测两个现有数据点内的值时也很有用。

scipy.interpolate.interp1d(x, y, kind='linear', axis=-1, copy=True, bounds_error=None, fill_value=nan, assume_sorted=False)

其中,x 是一维数据;y 是 N 维数据且 y 在插值的方向轴上长度必须和 x 相等;kind 指定了插值类型(linear,nearest,zero,slinear,quadratic,cubic,previous,next),其中 zero,slinear,quadratic 和 cubic 指定了零、一、二、三阶样条插值;previous 和 next 仅仅返回当前点的前一个/后一个值。默认为 linear 线性插值。

下面通过应用一些数据引入我们的主题,看看如何使用scipy.interpolate进行插值。

import numpy as np

#from scipy import interpolate

import matplotlib.pyplot as plt

from scipy.interpolate import interp1d

x = np.linspace(0, 10, num=11, endpoint=True)

y = np.cos(-x**2.0)

f = interp1d(x, y)

f2 = interp1d(x, y, kind='cubic')

xnew = np.linspace(0, 10, num=41, endpoint=True)

import matplotlib.pyplot as plt

plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')

plt.legend(['data', 'linear', 'cubic'], loc='best')

plt.show()

image.png

或者简单这样理解:

image.png

执行上面示例代码,得到以下结果

[ 0\. 0.36363636 0.72727273 1.09090909 1.45454545 1.81818182

2.18181818 2.54545455 2.90909091 3.27272727 3.63636364 4\. ] [-0.65364362 -0.61966189 -0.51077021 -0.31047698 -0.00715476 0.37976236

0.76715099 0.99239518 0.85886263 0.27994201 -0.52586509 -0.99582185]

现在,有两个数组。 假设这两个数组作为2维空间(平面)点的两个维度,使用下面的程序进行绘图,并看看它们的样子。

plt.plot(x, y,’o’)

plt.show()

也可以展示散点形式:

image.png

一维插值法

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, f1(xnew), '-', xnew, f2(xnew), '--')

plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')

plt.show()

上述程序将生成以下输出 -

image.png

样条曲线

为了通过数据点画出平滑的曲线,绘图员曾经使用薄的柔性木条,硬橡胶,金属或塑料称为机械样条。 为了使用机械花键,在设计中沿着曲线明确选择了一些销钉,然后将花键弯曲,以便它们接触到每个销钉。

显然,在这种结构下,样条曲线在这些引脚上插入曲线。 它可以用来在其他图纸中重现曲线。 引脚所在的点称为结。 可以通过调整结点的位置来改变样条线所定义的曲线的形状。

单变量样条

一维平滑样条拟合一组给定的数据点。 Scipy.interpolate中的UnivariateSpline类是创建基于固定数据点类的函数的便捷方法 - scipy.interpolate.UnivariateSpline(x,y,w = None,bbox = [None,None],k = 3,s = None,ext = 0,check_finite = False)。

下面来看看一个例子。

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()

使用平滑参数的默认值。效果如下

image.png

spl = UnivariateSpline(x, y)

xs = np.linspace(-3, 3, 1000)

plt.plot(xs, spl(xs), 'g', lw = 3)

plt.show()

手动更改平滑量。效果如下 -

image.png

spl.set_smoothing_factor(0.5)

plt.plot(xs, spl(xs), 'b', lw = 3)

plt.show()

效果如下 -

image.png

你可能感兴趣的:(python,interpolate,用法)