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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:35:31