【问题标题】:Interpolation between two xarray datasets with Basemap使用 Basemap 在两个 xarray 数据集之间进行插值
【发布时间】:2016-12-13 12:37:59
【问题描述】:

我有两个不同的 xarray 数据集,它们具有不同的纬度/经度网格分辨率。我想将分辨率较低的一个 xarray 重新网格化为与分辨率较高的一个 xarray 相同的分辨率。我找到了一些示例(例如,http://earthpy.org/interpolation_between_grids_with_basemap.html),但它对我不起作用。这是我为测试而制作的一个示例:

import numpy as np
import xarray as xray
import mpl_toolkits.basemap

var1=xray.DataArray(np.random.randn(len(np.linspace(40.5,49.5,10)),len(np.linspace(-39.5,-20.5,20))),coords=[np.linspace(40.5,49.5,10), np.linspace(-39.5,-20.5,20)],dims=['lat','lon'])

(xlon, xlat)=np.meshgrid(np.linspace(-39.875,-20.125,80),np.linspace(40.125,49.875,40))
var2=xray.DataArray(-xlon**2+xlat**2,coords=[np.linspace(40.125,49.875,40),np.linspace(-39.875,-20.125,80)],dims=['lat','lon'])

mpl_toolkits.basemap.interp(var1,var1.lon,var1.lat,var2.lon,var2.lat,checkbounds=False,masked=False,order=0)

我收到以下错误:

ValueError: xout 和 yout 必须具有相同的形状!

截图:

basemap.interp() 是否要求 xout 和 yout 形状相同?那么 var2 需要是正方形吗?我的任何数据集几乎都不是这种情况!如何将 var1 重新网格为与 var2 相同的分辨率?

注意:在重新网格化后,我想在给定与 var2 相关的一些条件下对 var1 进行子采样。例如:

var1_subset = var1.where(var2>1000)

所以我想在插值过程中尽量减少网格点的任何损失。

【问题讨论】:

    标签: python-2.7 matplotlib matplotlib-basemap python-xarray


    【解决方案1】:

    basemap.interp 只有在 xout 和 yout 的数量相同或输出 nlon 和 nlats 的数量相同时才会起作用,

    为什么不生成相同长度的输出 nlats 和 nlons 并在以后对其进行子集化。

    例如:

    import numpy as np
    import xarray as xray 
    import mpl_toolkits.basemap
    var1=xray.DataArray(np.random.randn(len(np.linspace(40.5,49.5,10)),len(np.linspace(-39.5,-20.5,20))),coords=[np.linspace(40.5,49.5,10), np.linspace(-39.5,-20.5,20)],dims=['lat','lon'])
    
    (xlon,xlat)=np.meshgrid(np.linspace(-39.875,20.125,80),np.linspace(40.125,49.875,80))
    var2=xray.DataArray(-xlon**2+xlat**2,coords[np.linspace(40.125,49.875,80),np.linspace(-39.875,-20.125,80)],dims=['lat','lon'])
    mpl_toolkits.basemap.interp(var1,var1.lon,var1.lat,var2.lon,var2.lat,checkbounds=False,masked=False,order=0)
    

    这是另一个很酷的 xarray 技巧。

    lonreg=var1.groupby_bins('lon',np.linspace(-39.875,20.125,80)).mean(dim='lon')
    
    regridded=lonreg.groupby_bins('lat',np.linspace(-39.5,20.5,20)).mean(dim='lat')
    

    如果你想要加权平均重新网格化,很容易通过在 groupby 对象上使用权重和求和函数来扩展面积平均重新网格化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 2015-08-11
      • 2018-06-27
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多