Q-Logo 我的学习笔记分享

Python一维线性插值(内插和外插)

一维线性插值是数值计算中常用的功能。一种办法是自己推一下插值的公式,然后写个函数来实现。但是Python在数值计算领域绝非浪得虚名,这种常用的功能当然是有现成方法的。Python的numpy和scipy包都提供了线性插值的功能,尤其是后者,还支持外插,可以直接使用。

numpy.interp线性插值

Numpy的 interp 函数支持根据给定的xp和fp,对x进行内插,对不在给定xp范围内的x,可以通过left和right指定返回值。

interp(x, xp, fp, left=None, right=None, period=None)

一维线性插值

参数

x : array_like,要计算插值的x坐标

xp : 1-D数值序列,一般是升序排列的x数据点

fp : 1-D数值序列,与x数据点对应的y坐标,必须与xp长度相同

left : 当x < xp[0] 时的返回值, 默认是fp[0]

right : 当x > xp[-1] 时的返回值, 默认是fp[-1]

返回值

y : 一维线性插值的结果,与x形状相同

举例:

>>> xp = [1, 2, 3]
>>> fp = [3, 2, 0]
>>> np.interp(2.5, xp, fp)
1.0
>>> np.interp([0, 1, 1.5, 2.72, 3.14], xp, fp)
array([3. , 3. , 2.5 , 0.56, 0. ])

scipy.interpolate.interp1d线性插值

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

一维函数插值

x和y是用于逼近函数y=f(x)的数组,此方法返回一个函数,函数调用后通过插值方式找到新数据点的返回值。

参数:

x : 1-D数值数组,一般是升序排列的x数据点

y : N-D数值数组,与x数据点对应的y坐标,插值维的长度必须与x长度相同

kind : 字符串或整数,给出插值的样条曲线的阶数,线性插值用'linear'

bounds_error : 布尔值,越界是否报错,除非fill_value='extrapolate',否则默认越界时报错

fill_value : 数组或'extrapolate',指定不在x范围内时的填充值或填充方法。当为'extrapolate'时,返回的函数会对落在x范围外的值进行外插;当为一个二元素元组(例如(3,0))且bounds_error=False时,返回的函数会对小于x[0]的值返回元组中第一个元素(例如3),对大于x[-1]的值返回元组中第二个元素(例如0)。

举例:

from scipy.interpolate import interp1d

>>> x = [1, 2, 3]

>>> y = [3, 2, 0]

>>> f = interp1d(x,y,fill_value=(3,0),bounds_error=False) # 线性内插

>>> f([0, 1, 1.5, 2.72, 3.14])

array([3. , 3. , 2.5 , 0.56, 0. ])

>>> fe = interp1d(x,y, fill_value='extrapolate') # 线性内插+外插

>>> fe([0, 1, 1.5, 2.72, 3.14])

array([ 4. , 3. , 2.5 , 0.56, -0.28])

总结

如果只需要线性内插,可以使用numpy.interp或scipy.interpolate.interp1d,如果需要外插,用scipy.interpolate.interp1d带fill_value='extrapolate'参数来实现。