【问题标题】:slice wrapping data with xarray用 xarray 切片包装数据
【发布时间】:2020-02-27 03:49:34
【问题描述】:

我有一个带有全局数据的 xarray.DataArray。例如:

import numpy as np
import xarray as xr

nlat=46
nlon=90

lat=np.linspace(-90, 90, nlat, endpoint=True)
lat=xr.DataArray(lat, dims=('lat',), coords={'lat':lat}, 
    attrs={'units':'degree north', 'name':'latitude'})

lon=np.linspace(0, 360, nlon, endpoint=False)
lon=xr.DataArray(lon, dims=('lon',), coords={'lon':lon}, 
    attrs={'units':'degree east', 'name':'longitude'})

d=xr.DataArray(np.random.rand(nlat, nlon), 
    dims=('lat', 'lon'), coords={'lat':lat, 'lon':lon})

我现在想将数据分割成一个区域。大多数情况下这很容易:

aus = d.sel(lat=slice(-44,-10), lon=slice(110, 155))

问题在于环绕边框的区域,例如:

gb = d.sel(lat=slice(50, 60), lon=slice(351, 3))

当然,这会返回一个空数组,如 351>3。

目前,我帮助自己移动网格,然后选择:

d['lon'].values[d['lon'].values>180] -= 360
d = d.sortby(d['lon'])
gb = d.sel(lat=slice(50, 60), lon=slice(-9, 3))

没有更好的办法吗?

【问题讨论】:

标签: python python-xarray


【解决方案1】:

如果您想避免移动网格,有两个选项可能会有所帮助:

  1. xr.DataArray.where 方法,条件指定所需的 d.lon 边界:
lon_lower = 351
lon_upper = 3

%timeit d.where((d.lon > lon_lower) | (d.lon < lon_upper), drop=True)
# 1.97 ms ± 50.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
  1. 沿 lon 轴的逻辑索引:
%timeit d[:,(d.lon.values > lon_lower) | (d.lon.values < lon_upper)]
# 457 µs ± 10.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

比较切片的时间:

%timeit d.sel(lon=slice(10,30))
# 452 µs ± 13.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

【讨论】:

  • 感谢您的想法。我有点希望有一种简单的方法可以使经度在之后的顺序正确(即 355 在 0 之前)。但我想这期望太高了。
猜你喜欢
  • 2019-04-11
  • 2020-10-08
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2018-01-11
  • 2017-03-06
相关资源
最近更新 更多