我有一个二维的xarray数据集,我想在lon和lot坐标上插值,这样我就有了更高的分辨率,但是这些值与每个坐标上的原始值完全对应。
我认为优秀的^{air
值外,在插值数据集中将出现16次,但情况并非如此
有人知道原始数据集和插值数据集不对齐的原因是什么吗?我如何解决它
ds = xr.tutorial.open_dataset("air_temperature").isel(time=0)
fig, axes = plt.subplots(ncols=2, figsize=(10, 4))
ds_sel=ds.sel(lon=slice(250,260),lat=slice(40,30))
ds.air.plot(ax=axes[0],xlim=(250,260),ylim=(30,40))
axes[0].set_title("Raw data")
# Interpolated data
new_lon = np.linspace(ds.lon[0], ds.lon[-1], ds.dims["lon"] * 4)
new_lat = np.linspace(ds.lat[0], ds.lat[-1], ds.dims["lat"] * 4)
dsi = ds.interp(lat=new_lat, lon=new_lon,method="nearest")
dsi_sel=dsi.sel(lon=slice(250,260),lat=slice(40,30))
dsi.air.plot(ax=axes[1],xlim=(250,260),ylim=(30,40))
axes[1].set_title("Interpolated data")
显示具有唯一性的值
unique, counts = np.unique(ds_sel.air.values, return_counts=True)
print("original values",dict(zip(unique, counts)))
unique, counts = np.unique(dsi_sel.air.values, return_counts=True)
print("interpolated values",dict(zip(unique, counts)))
我明白了
original values {262.1: 1, 263.1: 1, 263.9: 1, 264.4: 1, 265.19998: 1, 266.6: 1, 266.79: 1, 266.9: 2, 268.29: 1, 269.79: 1, 270.4: 1, 273.0: 1, 273.6: 1, 275.19998: 1, 276.29: 1, 278.0: 1, 278.5: 1, 278.6: 1, 281.5: 1, 282.1: 1, 282.29: 1, 284.6: 1, 286.79: 1, 288.0: 1}
interpolated values {262.1: 4, 263.1: 8, 263.9: 8, 264.4: 8, 265.19998: 4, 266.6: 16, 266.79: 16, 266.9: 24, 268.29: 8, 269.79: 20, 270.4: 10, 273.0: 20, 273.6: 16, 275.19998: 8, 276.29: 20, 278.0: 16, 278.5: 10, 278.6: 8, 281.5: 4, 282.1: 16, 282.29: 8, 284.6: 8, 286.79: 8, 288.0: 4}
我认为您在概念上遇到了fencepost错误(请参阅本页的部分:https://en.wikipedia.org/wiki/Off-by-one_error)
您应该将xarray坐标解释为“中点”,而不是单元边界
您的
new_lon
没有很好地划分为1/2、1/4、1/8等:它不包括所有原始坐标
将“一个接一个”考虑在内:
然后,您可以检查原始和插值的第一行的部分:
我觉得这很好:
当然,在执行最近插值时,您可能会得到以下结果: 0.5与0.0的距离与1.0的距离一样远,因此您不适当地必须偏移“向上”或“向下”以获得单个最接近的值
还请注意
.plot()
命令(用于绘制Matplotlib四边形网格)必须以某种方式从中点推断边界。这有时会导致绘制的边界与您可能想到的略有不同(尤其是在坐标间距不均匀的情况下)相关问题 更多 >
编程相关推荐