[英]slice wrapping data with xarray
我有一個帶有全局數據的 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))
沒有更好的辦法嗎?
如果您想避免移動網格,有兩個選項可能會有所幫助:
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)
%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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.