данные обтекания среза с помощью xarray - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть 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 Ответ

1 голос
/ 01 марта 2020

Если вы хотите избежать смещения сетки, есть две опции, которые могут помочь:

  1. метод xr.DataArray.where , с условием, указывающим желаемый d. длинные границы:
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)
логическое индексирование по оси 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...