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'参数来实现。
冀公网安备 13010402001886号