繁体   English   中英

用 xarray 插值周期边界

[英]interpolation periodic boundaries with xarray

我想将许多包含全球气候数据的xarray数据集插入到一个公共网格中。 xarray实际上有一个 interp interp()方法可以正常工作,但据我所知,它没有考虑任何周期性边界,尽管在球体上插值时这是必要的。 相反,旧网格之外的数据点被外推或用 NaN 填充。 插值基于 scipy package,我认为 scipy 的其他插值方法也不支持周期边界。

我正在考虑使用xesmf ,但想知道仅使用 xarray 是否有更简单的解决方案?

我更喜欢线性插值,但在这方面很灵活。

如果您愿意将数据沿纵向包装,这是可能的。 有一些假设( DataArray有坐标 'lon' 和 'lat','lon' 跨越几乎 0-360 并且不完全 go 到边界),并从这个答案中借用一些想法,这应该有效:

import numpy as np
import xarray as xr

data = np.arange(360 * 180).reshape(360, 180)

lon = np.linspace(0.5, 359.5, 360)
lat = np.linspace(-89.5, 89.5, 180)

da = xr.DataArray(
    coords=dict(
        lon=lon,
        lat=lat,
    ),
    data=data,
)

# These will both print 'nan' as lon is outside 0.5-359.5
print(da.interp(lon=0.3, lat=32).values)
print(da.interp(lon=359.7, lat=32).values)

def xr_add_cyclic_points(da):
    """
    Add cyclic points at start and end of `lon` dimension of data array.
    
    Inputs
    da: xr.DataArray including dimensions (lat,lon)
    """
    # Borrows heavily from cartopy.util.add_cyclic point, but adds at start and end.

    lon_idx = da.dims.index('lon')
    
    start_slice = [slice(None)] * da.ndim
    end_slice = [slice(None)] * da.ndim
    start_slice[lon_idx] = slice(0, 1)
    end_slice[lon_idx] = slice(-1, None)
    
    wrap_data = np.concatenate([da.values[tuple(end_slice)], da.values, da.values[tuple(start_slice)]], axis=lon_idx)
    wrap_lon = np.concatenate([da.lon.values[-1:] - 360, da.lon.values, da.lon.values[0:1] + 360])

    # Generate output DataArray with new data but same structure as input
    outp_da = xr.DataArray(data=wrap_data, 
                           coords=dict(lat=da.lat, lon=wrap_lon), 
                           dims=da.dims, 
                           attrs=da.attrs)
    
    return outp_da

da_wrapped = xr_add_cyclic_points(da)

# These will print interpolated values.
print(da_wrapped.interp(lon=0.3, lat=32).values)
print(da_wrapped.interp(lon=359.7, lat=32).values)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM