scipy.interpolate.griddata冗余数据致慢及插值结果差异的技术咨询
关于规则网格插值的疑问解答
1. 插值所需点数的误解澄清
你混淆了两种不同的插值逻辑:
- 针对规则矩形网格的双线性插值:需要目标点所在网格单元的4个顶点——它是先在x方向做线性插值,再在y方向做线性插值,最终组合得到结果,并非3个点。
scipy.interpolate.griddata(method='linear')实现的是Delaunay三角剖分后的三角形内线性插值:这种场景下每个目标点依赖所在三角形的3个顶点,但三角剖分是基于所有输入点生成的,局部点集的剖分结构和全局完全不同,这也是结果差异的核心原因。
2. 快速筛选目标区域网格点的高效方案
你的网格是等距规则网格,完全不需要循环筛选,直接通过索引切片即可完成,耗时可以忽略:
假设网格的x、y轴索引范围是0~599,中心400×400区域对应的索引范围为:
- x起始索引:
(600 - 400) // 2 = 100,结束索引:100 + 400 = 500(左闭右开,对应100~499) - y起始索引:100,结束索引:500
用numpy向量化操作提取数据:
# 假设grid_x、grid_y是(600,600)的等距网格数组,values是对应标量数组 filtered_x = grid_x[100:500, 100:500].flatten() filtered_y = grid_y[100:500, 100:500].flatten() filtered_values = values[100:500, 100:500].flatten()
3. 全量与缩减数据插值结果差异的原因
结果差异本质是griddata的linear方法依赖全局三角剖分:
- 全量数据的三角剖分基于整个600×600网格生成,目标点所在的三角形由全局网格点构成;
- 仅用中心400×400点集时,边缘区域的目标点会处于点集边界,三角剖分的三角形形状和全局场景完全不同,导致插值结果偏离。
更优替代方案
既然源数据是规则等距网格,无需使用griddata,改用scipy.interpolate.RegularGridInterpolator效率更高、结果更准确:
from scipy.interpolate import RegularGridInterpolator # x_coords为一维x网格坐标(长度600),y_coords为一维y网格坐标(长度600) interp = RegularGridInterpolator((y_coords, x_coords), values, method='linear') # target_points为(1000, 2)的目标坐标数组,格式为[[y1,x1], [y2,x2], ...] result = interp(target_points)
该方法直接利用规则网格结构,无需三角剖分,速度比griddata快数个数量级,且仅需保留一维坐标数组和二维值数组即可。
内容的提问来源于stack exchange,提问作者FordPrefect
相关产品推荐
相关产品推荐

