SciPy/NumPy中替代interp1d的一维线性插值函数对象方案是什么?
构造可复用的线性插值函数对象(替代legacy的
interp1d) 在scipy.interpolate.interp1d被标记为旧版的情况下,有三种简便方案可以构造类似PchipInterpolator的可调用线性插值函数/对象:
方案1:用CubicSpline指定线性样条(最推荐)
CubicSpline支持通过k=1参数指定线性阶数的样条插值,返回的对象是可调用的,用法和PchipInterpolator完全一致,属于SciPy官方推荐的现代接口:
import numpy as np from scipy.interpolate import CubicSpline # 原始时间-值对 x = np.array([0, 1, 2, 3]) y = np.array([0, 2, 1, 3]) # 创建线性插值函数对象 linear_interp = CubicSpline(x, y, k=1) # 查询任意插值点 print(linear_interp(0.5)) # 输出: 1.0 print(linear_interp([1.2, 2.7]))# 输出: [1.8 2.7]
这个方案的优势是和SciPy其他插值对象的API完全统一,还支持求导、积分等扩展操作,性能和稳定性都有保障。
方案2:自定义包装numpy.interp的函数对象
如果只想依赖NumPy,可以通过闭包或自定义类封装numpy.interp,实现可复用的插值函数:
闭包实现(轻量简洁)
import numpy as np def create_linear_interp(x, y): def interp_func(x_new): return np.interp(x_new, x, y) return interp_func # 使用示例 x = np.array([0, 1, 2, 3]) y = np.array([0, 2, 1, 3]) linear_interp = create_linear_interp(x, y) print(linear_interp(0.5)) # 1.0 print(linear_interp([1.2, 2.7]))# [1.8 2.7]
类实现(贴近SciPy插值对象风格)
import numpy as np class LinearInterpolator: def __init__(self, x, y): self.x = np.asarray(x) self.y = np.asarray(y) def __call__(self, x_new): return np.interp(x_new, self.x, self.y) # 使用示例 linear_interp = LinearInterpolator([0,1,2,3], [0,2,1,3]) print(linear_interp(0.5)) # 1.0
方案3:用PPoly手动构建分段线性多项式
PPoly是SciPy中表示分段多项式的底层类,可以手动构造线性分段插值对象:
import numpy as np from scipy.interpolate import PPoly # 原始节点 x = np.array([0, 1, 2, 3]) y = np.array([0, 2, 1, 3]) # 计算每段的斜率 slopes = np.diff(y) / np.diff(x) # 构造分段多项式系数(PPoly要求系数按高次到低次排列,一次多项式为[斜率, 截距]) coeffs = np.vstack([slopes, y[:-1]]).T # 创建可调用的插值对象 linear_interp = PPoly(coeffs.T, x) # 查询插值结果 print(linear_interp(0.5)) # 1.0
内容的提问来源于stack exchange,提问作者pipe
相关产品推荐
相关产品推荐

