scipy.interpolate.LinearNDInterpolator与interp2d插值结果差异问询
为什么scipy的interp2d和LinearNDInterpolator插值结果不同?
核心差异:插值方法本质不同
interp2d和LinearNDInterpolator虽都标注为"线性插值",但适用场景与计算逻辑完全不同:
- interp2d:针对规则网格数据执行双线性插值。它会先将输入点视为规则网格(提取x、y的唯一值并排序),再分别在x、y方向做线性插值,最终组合得到结果。
- LinearNDInterpolator:针对任意分布的不规则点集,先对输入点做Delaunay三角剖分,再在目标点所在的三角形内执行三角形线性插值。
你的案例具体计算验证
输入的矩形规则网格点:
# x,y坐标点 a=[[0.6, 20], [0.6, 30], [0.8, 20], [0.8, 30]] # 对应z值 b=[1.71, 1.43, 1.57, 1.44]
目标计算点:[0.7,25]
1. interp2d的双线性插值计算
步骤1:先在x=0.6和x=0.8的y方向插值,得到y=25时的z值
- x=0.6时:
z = 1.71 + (1.43-1.71)*(25-20)/(30-20) = 1.57 - x=0.8时:
z = 1.57 + (1.44-1.57)*(25-20)/(30-20) = 1.505
步骤2:在y=25的x方向插值,得到x=0.7时的z值
z = 1.57 + (1.505-1.57)*(0.7-0.6)/(0.8-0.6) = 1.5375
这就是b1的结果。
2. LinearNDInterpolator的三角剖分插值计算
四个矩形点会被剖分为两个三角形,目标点[0.7,25]落在三角形(0.6,30), (0.8,20), (0.8,30)内。拟合该三角形的平面方程z = Ax + By + C,代入三个点求解得:
- A=0.05,B=-0.013,C=1.79
代入目标点计算:z = 0.05*0.7 -0.013*25 +1.79 = 0.035 -0.325 +1.79 = 1.5
这就是b2的结果。
结论
两种函数的结果差异由插值方法的本质不同导致:
- 处理规则网格数据时,优先使用
interp2d(或scipy官方推荐替代的RegularGridInterpolator) - 处理不规则分布点集时,使用
LinearNDInterpolator
内容的提问来源于stack exchange,提问作者manuel martin
相关产品推荐
相关产品推荐

