np.interp最快但仅支持线性插值,要求x单调且不生成对象,适合高频调用;多维插值必须用scipy,规则网格选regulargridinterpolator,散点用griddata。

一维插值用 np.interp 最快,但只支持线性
如果你只是把离散点连成直线、查中间值,np.interp 是最轻量的选择。它不依赖 SciPy,纯 NumPy 实现,速度极快,且不生成对象——适合循环中高频调用。
常见错误是传错参数顺序:np.interp(x_new, x, y),不是 (x, y, x_new)。一旦 x 不严格递增,结果会错得毫无提示。
-
x必须是单调递增(或递减)的一维数组;若乱序,先用np.argsort排序x和y - 超出
x范围的x_new值,默认外推为边界值(不会报错,但可能不是你想要的) - 不支持样条、最近邻等其他插值方式——要这些,必须换
scipy.interpolate
示例:
import numpy as np<br>x = np.array([0, 2, 4, 6])<br>y = np.array([1, 5, 3, 8])<br>x_new = np.array([1, 3, 5])<br>np.interp(x_new, x, y) # → array([3., 4., 5.5])
多维插值必须用 scipy.interpolate,griddata 和 RegularGridInterpolator 选哪个?
NumPy 本身不提供多维插值函数。所谓“NumPy 多维插值”实际是误传,真正干活的是 SciPy。关键在数据结构:规则网格还是散点?
- 输入是规则网格(如图像像素坐标 + 值),用
RegularGridInterpolator:速度快、内存省、支持任意维度,但要求x,y,z各自独立排序并构成完整网格 - 输入是无结构散点(比如传感器随机采样点),只能用
griddata:自动三角剖分,支持 2D/3D,但维度 >3 就不支持,且每次调用都重建 Delaunay,慢 - 别用
interp2d:已标记为 deprecated,内部行为不稳定,返回对象在多次调用时可能缓存旧网格
示例(规则网格):
from scipy.interpolate import RegularGridInterpolator<br>x = np.linspace(0, 1, 10)<br>y = np.linspace(0, 1, 10)<br>X, Y = np.meshgrid(x, y, indexing='ij')<br>Z = np.sin(X) * np.cos(Y)<br>interp_func = RegularGridInterpolator((x, y), Z)<br>points = np.array([[0.25, 0.75], [0.5, 0.5]])<br>interp_func(points) # → array([0.17..., 0.45...])
griddata 报错 “Invalid triangulation” 怎么办?
这个错误通常不是数据真有问题,而是数值精度导致的退化三角形——比如多个点几乎共线、或坐标值过大(如经纬度用 1e6 级整数)。
- 先检查重复点:
len(points) != len(np.unique(points, axis=0)),有重复必须去重 - 对坐标做中心化与缩放:
points_scaled = (points - points.mean(axis=0)) / points.std(axis=0),插完再逆变换 - 避免用
method='cubic'在稀疏点上:它需要局部足够密度,否则直接崩;优先试'linear'或'nearest' - 如果只有 3–4 个点,
griddata无法构造三角形,此时应降级为最小二乘拟合或直接用np.linalg.lstsq
插值结果出现意外 NaN 或突变,先查这三件事
插值后图像/曲线突然断掉或飞出,往往不是算法问题,而是输入没清理干净。
-
y数组里混了np.nan或np.inf:插值器不会主动过滤,会污染整个结果区域。用np.isfinite(y).all()检查 - 查询点
x_new中存在np.nan:有些插值器(如RegularGridInterpolator)会静默返回nan,不报错 - 多维时维度对齐错误:比如
griddata的points是(N, 2),但values是(2, N),形状不匹配会导致广播异常,结果不可信
复杂点永远在数据准备阶段——算法再稳,喂进去的是脏数据,出来的就是不可靠信号。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











