Numpy Scipy二维分段线性插值结果与预期双线性插值不符问题
问题:griddata线性插值结果与双线性插值预期不符
我的点集:
points = np.array([[0, 105],[5000, 105],[0, 135],[5000, 135],[0, 165],[5000, 165]])
对应值:
values = np.array([[300, 380, 300, 390, 300, 400]]).transpose()
待插值输入:
xi = np.array([[2500, 105],[2500, 125],[2500, 135],[2500, 150],[2500, 165]])
按双线性插值的预期结果:
[340, 343.3333, 345, 347.5, 350]
手动计算第二个插值点的过程:
x1=2500, y1=105 得到 z1=340 x2=2500, y2=135 得到 z2=345 因此 x3=2500, y3=125 得到 z3=343.3333
但使用以下代码:
gd = griddata(points, values, xi, method='linear', rescale=True)
得到的结果却是:
[340, 345, 345, 345, 350]
原因分析
scipy中griddata的method='linear'实现的是三角形线性插值:它会先对输入的非结构化点集做Delaunay三角剖分,再在每个三角形内部做线性插值。你的点集虽然是规则网格,但以非结构化点传入时,剖分后的三角形会让(2500,125)这类点落在某一三角形中,其线性插值结果与双线性插值的计算逻辑不同,导致结果不符。
双线性插值是专门针对规则矩形网格的插值方法,需要用对应工具实现。
解决方案
使用RectBivariateSpline(推荐)来实现双线性插值,代码示例:
from scipy.interpolate import RectBivariateSpline import numpy as np # 提取规则网格的x、y轴坐标 x_grid = np.array([0, 5000]) y_grid = np.array([105, 135, 165]) # 将values整理为与网格对应的二维数组 z_grid = np.array([ [300, 380], [300, 390], [300, 400] ]) # 创建双线性插值器(kx=1、ky=1对应双线性) interpolator = RectBivariateSpline(y_grid, x_grid, z_grid, kx=1, ky=1) # 计算插值结果,注意输入顺序为y、x xi = np.array([[2500, 105],[2500, 125],[2500, 135],[2500, 150],[2500, 165]]) results = interpolator(xi[:, 1], xi[:, 0]) print(results.flatten()) # 输出:[340. 343.33333333 345. 347.5 350. ]
内容的提问来源于stack exchange,提问作者qwertytam
相关产品推荐
相关产品推荐

