簡體   English   中英

使用 xarray 切片包裝數據

[英]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))

沒有更好的辦法嗎?

如果您想避免移動網格,有兩個選項可能會有所幫助:

  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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM