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

为何SciPy的interpolate griddata对不同规模样本返回不同结果?

问题:scipy.griddata样本区与全数据集插值结果不一致(含中间区域)

问题背景

我有一组间隔20×20cm的均匀分布网格点,需要用scipy.interpolate.griddata(method="cubic")对存储在含x、y、value列的Pandas DataFrame中的值进行插值。测试时选取了数据集的中间样本区域,发现将脚本应用于全数据集后,插值结果存在差异。差异虽小,但会导致后续处理的整体结果不同,使得用样本区快速测试参数几乎无法实现。

样本区位于全数据集点集的中间位置,且两次插值(样本区与全数据集)使用的网格及参数完全一致,样本区的点和对应值与全数据集该区域的内容完全相同。我原本预期样本区边缘插值结果会不同,但中间区域不应存在差异。这种现象在使用linear或nearest等不同插值方法调用scipy.interpolate.griddata时同样出现。是否有可调整或添加的设置(如更换库或方法)来避免该问题?

代码示例

import numpy as np
import pandas as pd
import geopandas as gpd
from scipy import interpolate

# 导入数据
df_grid = pd.read_table("whole_dataset.csv", sep=",", header=0)
# 切换使用样本区或全数据集
df = pd.read_table("sample_section.csv", sep=",", header=0) 
# df = pd.read_table("whole_dataset.csv", sep=",", header=0)

# 定义插值用的规则网格
x_min = df_grid['x'].min()
x_max = df_grid['x'].max()
y_min = df_grid['y'].min()
y_max = df_grid['y'].max()
spacing = 0.2
x_grid = np.arange(x_min, x_max + spacing, spacing)
y_grid = np.arange(y_min, y_max + spacing, spacing)

# 创建网格矩阵
X, Y = np.meshgrid(x_grid, y_grid)

# 使用cubic方法插值
points = df[['x', 'y']].values
values = df['value'].values
interpolated_values = interpolate.griddata(points, values, (X, Y), method='cubic')

# 将插值结果转为带坐标的DataFrame
data = pd.DataFrame({
    'x': X.ravel(),
    'y': Y.ravel(),
    'value': interpolated_values.ravel()
})

# 剔除空值
data = data.dropna().reset_index(drop=True)

# 转为GeoDataFrame并保存
gdf = gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data['x'], data['y']))
gdf.to_file("data.geojson", driver='GeoJSON', crs="EPSG:32633")

差异展示

插值结果差异对比

补充信息

  • 测试数据集包含全量数据和样本区数据,样本区是从全数据集空间中心区域提取的,坐标参考系统为WGS 84 / UTM zone 33N(EPSG:32633)
  • 差异对比图为QGIS软件截图,两个插值图层使用了完全相同的符号化配置

内容的提问来源于stack exchange,提问作者jonsken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:57:48