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

寻求支持线性外插的scipy.interp1d分段线性插值替代方案

支持线性外插的分段线性插值:scipy.interp1d的替代方案

scipy.interpolate.interp1d已被标记为旧版(legacy)组件,不再接收更新,未来可能从SciPy中移除。官方文档推荐用numpy.interp做分段线性插值,但numpy.interp仅支持常数外插,无法满足线性外插的需求。以下是几种可行的替代方案:

方案1:使用scipy.interpolate.LinearNDInterpolator

虽然名称带有ND(多维)标识,但它完全适配一维场景的分段线性插值,且默认支持线性外插。示例代码:

import numpy as np
from scipy.interpolate import LinearNDInterpolator
from matplotlib import pyplot as plt

a = np.linspace(0, 10, 11)
b = np.sin(a)
plt.plot(a, b, 'o')

x = np.linspace(-2, 12, 51)
# 构造插值器,注意将一维数组转为二维格式
interp = LinearNDInterpolator(a.reshape(-1, 1), b)
y = interp(x.reshape(-1, 1))
plt.plot(x, y, '+-')

plt.show()

方案2:基于numpy.interp手动实现线性外插

利用numpy.interp处理内插部分,对超出原数据范围的x值手动计算线性外插结果,逻辑简单直接,无需额外依赖SciPy插值模块:

import numpy as np
from matplotlib import pyplot as plt

a = np.linspace(0, 10, 11)
b = np.sin(a)
plt.plot(a, b, 'o')

x = np.linspace(-2, 12, 51)
# 先处理内插部分
y = np.interp(x, a, b)

# 处理左侧外插(x < 原数据最小值)
left_mask = x < a[0]
if np.any(left_mask):
    left_slope = (b[1] - b[0]) / (a[1] - a[0])
    y[left_mask] = b[0] + left_slope * (x[left_mask] - a[0])

# 处理右侧外插(x > 原数据最大值)
right_mask = x > a[-1]
if np.any(right_mask):
    right_slope = (b[-1] - b[-2]) / (a[-1] - a[-2])
    y[right_mask] = b[-1] + right_slope * (x[right_mask] - a[-1])

plt.plot(x, y, '+-')
plt.show()

方案3:使用scipy.interpolate.UnivariateSpline(线性样条配置)

通过设置k=1指定线性样条,同时ext=0开启外插功能,也能实现与原interp1d一致的效果:

import numpy as np
from scipy.interpolate import UnivariateSpline
from matplotlib import pyplot as plt

a = np.linspace(0, 10, 11)
b = np.sin(a)
plt.plot(a, b, 'o')

x = np.linspace(-2, 12, 51)
# k=1表示使用线性样条,ext=0表示允许外插
interp = UnivariateSpline(a, b, k=1, ext=0)
y = interp(x)
plt.plot(x, y, '+-')

plt.show()

以上三种方案均可实现原interp1d(fill_value='extrapolate')的分段线性插值+线性外插效果:方案2适合轻量场景,仅依赖numpy;方案1和3则符合SciPy的现代API规范。

内容的提问来源于stack exchange,提问作者schtandard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:13:19