上文使用Python实现数据的一维插值我们提到了使用python的scipy库进行一维插值,并且对比了线性(linear)和二次多项式(quadratic)两种方法,今天主要来介绍一下scipy.interpolate.interp1d函数的其他插值选项。
首先,interp1d函数由以下部分所组成
class 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’),包括 ‘linear’, ‘nearest’, ‘nearest-up’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘previous’, or ‘next’.
“zero”、“linear”、“quadratic”和“cubic”是指零、一、二或三阶的样条插值;
‘previous’ 和 ‘next’ 只是返回该点的上一个或下一个值
'nearest-up' 和 'nearest' 在对半整数(例如 0.5、1.5)进行插值时有所不同,“nearest-up”向上取整,“nearest”向下取整。
axis用于指定沿其进行插值的 y 轴。默认为最后一个y轴。
copy(布尔类型)如果为 True,则该类函数创建 x 和 y 的内部副本。如果为 False,则使用对 x 和 y 的引用。默认是True。
bounds_error(布尔类型)如果为 True,则在任何时候尝试对 x 范围之外的值进行插值时都会引发 ValueError(需要外插)。如果为 False,则为越界值分配 fill_value。默认情况下会报错,除非fill_value="extrapolate"。
fill_value,如果是 ndarray(或浮点数),则此值将用于填充数据范围之外的请求点。如果未提供,则默认值为 NaN。类数组必须正确广播到非插值轴的尺寸。如果是双元素元组,则第一个元素用作 x_new < x[0] 的填充值,第二个元素用于 x_new > x[-1]。任何不是 2 元素元组的东西(例如,列表或 ndarray,无论形状如何)都被视为一个类似数组的参数,用于两个边界,如下所示,上面 = fill_value,fill_value。使用二元素元组或 ndarray 需要 bounds_error=False。
我们使用下述代码绘图进行对比
import numpy as np
from scipy.interpolate import interp1d
import pylab
A, nu, k = 10, 4, 2
def f(x, A, nu, k):
return A * np.exp(-k*x) * np.cos(2*np.pi * nu * x)
xmax, nx = 0.5, 8
x = np.linspace(0, xmax, nx)
y = f(x, A, nu, k)
f_nearest = interp1d(x, y,'nearest')
f_linear = interp1d(x, y,'linear')
f_cubic = interp1d(x, y,'cubic')
f_next = interp1d(x, y, 'next')
x2 = np.linspace(0, xmax, 100)
pylab.plot(x, y, 'o', label='data points')
pylab.plot(x2, f(x2, A, nu, k), label='exact')
pylab.plot(x2, f_nearest(x2), label='nearest')
pylab.plot(x2, f_linear(x2), label='linear')
pylab.plot(x2, f_cubic(x2), label='cubic')
pylab.plot(x2, f_next(x2), label='next')
pylab.legend(loc=1)
pylab.show()
可以通过上图对比各插值方式与原函数(exact)的曲线区别。