Python2转3时scipy.interpolate与mpl griddata插值结果差异求解
解决scipy.interpolate.griddata最近邻插值与旧matplotlib.mlab.griddata结果不一致的方案
核心差异原因
旧版matplotlib.mlab.griddata的interp='nn'(最近邻插值)是对整个网格区域所有点执行最近邻匹配,包括离散点组成的凸包以外的区域。而scipy.interpolate.griddata的method='nearest'默认仅对凸包以内的点做最近邻插值,凸包外的点默认返回NaN,如果设置fill_value=0会强制将凸包外所有点设为固定值0,不会执行最近邻匹配,这是结果差异的核心原因。
另外你现有代码存在3个明显错误:
- scipy分支插值方法写的是
method='cubic',没有改成需要的最近邻参数 - 开头的
MODE == 'mpl'是判断语法,赋值应该用单等号MODE = 'scipy' - 当
max_of_Z==0时,np.arange里的min是Python内置函数,应该替换为你定义的min_val变量
修复代码
直接使用scipy.interpolate.NearestNDInterpolator替代griddata即可完全匹配旧版mlab.griddata的最近邻插值效果,修改后的scipy分支代码如下:
else: from scipy.interpolate import NearestNDInterpolator # 拼接坐标点 points = np.column_stack((x, y)) # 初始化最近邻插值器 interp = NearestNDInterpolator(points, z) # 对网格执行插值,结果和旧版mlab.griddata interp='nn'完全一致 zi = interp(xi, yi)
效果验证
使用你提供的测试数据执行上述代码后,最近邻插值结果会和旧版matplotlib的结果完全一致,仅在z=0.6的坐标点周边显示对应的高值区域,其余区域为0。
内容的提问来源于stack exchange,提问作者Wboy
相关产品推荐
相关产品推荐

