np.interp仅支持一维线性插值且不支持nan,因其底层要求xp严格单调递增、不含nan,否则报valueerror或静默出错;处理含nan数据需先清洗,多维插值必须依赖scipy。

为什么直接用 np.interp 只能处理一维,且不支持 NaN?
np.interp 是 NumPy 原生最快的线性插值函数,但它严格要求输入 x 和 xp 都是 1D 升序数组,且 xp 中不能含 NaN —— 一旦有缺失值或非单调点,它会直接报错 ValueError: array must be monotonic 或静默返回错误结果。实际数据中常见传感器断点、时间戳乱序、多列并行插值需求,这时硬套 np.interp 反而更费调试时间。
- 若需插值列向量(如多组
y对同一xp),必须循环调用np.interp,无法向量化 - 二维网格插值(如图像重采样)完全不支持,
np.interp不接受axis参数 - 想跳过
NaN点?得先用np.isfinite清洗xp和fp,否则结果不可靠
用 scipy.interpolate.interp1d 处理带 NaN 的一维数据
当原始数据含 NaN 或需要多次对不同 x 查询时,interp1d 更鲁棒。它内部自动剔除无效点,并支持 kind='linear'(默认)、'nearest'、'quadratic' 等模式。
- 构造时传入
bounds_error=False, fill_value="extrapolate",避免越界报错 - 若
xp有NaN,先执行mask = np.isfinite(xp) & np.isfinite(fp),再传xp[mask]和fp[mask] - 返回的是可调用对象,支持直接传入数组:
f = interp1d(xp_clean, fp_clean); y_new = f(x_new) - 注意:
interp1d默认要求xp单调,但设assume_sorted=False会自动排序(轻微性能损耗)
二维插值必须用 scipy.interpolate.RegularGridInterpolator
NumPy 没有原生二维插值,scipy 的 RegularGridInterpolator 是唯一高效方案,适用于规则网格(如图像、地理栅格)。它比 griddata 快一个数量级,且支持任意维度。
- 输入必须是分离的坐标轴:例如二维需
(x_axis, y_axis)(都是 1D 数组),而非完整XX, YY网格 - 数据
values必须是 shape 匹配的 ND 数组,如 (len(x_axis), len(y_axis)) - 查询点
points是形状为 (N, 2) 的数组,每行是[x_i, y_i],不能传两个独立 1D 数组 - 若原始数据是散点(不规则),先用
scipy.interpolate.griddata插到规则网格,再喂给RegularGridInterpolator,否则精度损失大
性能关键:何时该用 numba 加速自定义插值?
当插值逻辑复杂(如分段线性 + 边界条件判断)、数据量极大(>10M 点)、且调用频次高时,scipy 的 Python 层开销会成为瓶颈。此时手写 Numba JIT 函数收益明显。
- 用
@njit(fastmath=True)装饰器,禁用 Python 安全检查 - 避免在函数内调用
np.interp或scipy—— Numba 不支持它们 - 手动实现二分查找(
np.searchsorted在 Numba 中可用),再线性加权,比调库快 3–5 倍 - 注意:Numba 不支持字符串、动态类型、部分
np.ndarray方法(如.clip()),需用等效循环替代
插值不是“选个函数就行”的事——数据质量、维度结构、调用频率共同决定路径。盲目套 np.interp 看似简单,出问题时反而最难定位;而提前处理 NaN 和坐标单调性,比事后 debug 节省的时间多得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











