You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:53:29