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

如何在使用RegularGridInterpolator时界内线性插值界外最近邻插值

实现RegularGridInterpolator边界内线性插值、边界外最近邻插值的方案

实现思路

RegularGridInterpolator原生仅支持全局统一的插值/外插策略,要实现混合策略可以通过查询点预处理的方式实现,核心逻辑如下:

  • 规则网格的边界范围由各维度轴的最小、最大值定义,对于任意查询点,超出边界的坐标可以直接钳位到对应维度的边界值,得到边界上距离原查询点最近的坐标点
  • 对预处理后的坐标点直接调用线性插值即可:边界内的点不会被钳位修改,保持线性插值效果;边界外的点被映射到最近边界点,等效于最近邻外插效果

完整代码实现

import numpy as np
from scipy.interpolate import RegularGridInterpolator

# 构造示例规则网格与对应数据(可替换为你的实际数据)
x_axis = np.linspace(0, 10, 11)
y_axis = np.linspace(0, 10, 11)
z_axis = np.linspace(0, 10, 11)
grid_data = np.sin(x_axis[:, None, None]) * np.cos(y_axis[None, :, None]) * z_axis[None, None, :]

# 初始化线性插值器
linear_interpolator = RegularGridInterpolator(
    points=(x_axis, y_axis, z_axis),
    values=grid_data,
    method="linear",
    bounds_error=False
)

def mixed_interpolate(query_points):
    """
    混合插值函数:边界内线性插值,边界外最近邻插值
    :param query_points: 待查询的坐标数组,形状为(N, D),D为网格维度
    :return: 插值结果数组,形状为(N,)
    """
    # 获取各维度的边界上下限
    dim_bounds_low = [x_axis.min(), y_axis.min(), z_axis.min()]
    dim_bounds_high = [x_axis.max(), y_axis.max(), z_axis.max()]
    # 对查询点坐标做钳位处理
    clamped_points = np.clip(query_points, dim_bounds_low, dim_bounds_high)
    # 执行线性插值
    return linear_interpolator(clamped_points)

效果验证

可以用以下测试代码验证混合插值的效果:

# 测试坐标:包含边界内点、单维度超界点、多维度超界点
test_coords = np.array([
    [5, 5, 5],   # 完全在边界内
    [12, 5, 5],  # x维度超出上限
    [-2, 11, 4]  # x低于下限、y高于上限
])

print(mixed_interpolate(test_coords))

输出结果中:

  • 第一个点的结果和原生线性插值结果完全一致
  • 第二个点的结果和原生线性插值查询[10,5,5]的结果完全一致
  • 第三个点的结果和原生线性插值查询[0,10,4]的结果完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:24:04