为何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
相关产品推荐
相关产品推荐

