XArray - многомерное биннинг и сокращение массива для выборочного набора данных от 4 x 4 до 2 x 2 - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь уменьшить Xarray с 4 x 4 до 2 x 2 через оба измерения.Я не нашел удачи с текущим набором данных Xarray.Вот шаги, которым я следовал.Я хочу скопировать или сгруппировать по широте и долготе.

a = np.array(np.random.randint(1, 90+1,(4,4)),dtype=np.float64)

b = np.array(np.random.randint(1, 360+1,(4,4)),dtype=np.float64)

c = np.random.random_sample(16,)

c = c.reshape(4,4)

dsa = xr.Dataset()

dsa['CloudFraction'] = (('x', 'y'), c)

dsa.coords['latitude'] = (('x', 'y'), a)

dsa.coords['longitude'] = (('x', 'y'), b)

dsa

Размеры: (x: 4, y: 4)

Координаты:

latitude       (x, y) float64 23.0 16.0 53.0 1.0 ... 82.0 65.0 45.0 88.0
longitude      (x, y) float64 219.0 13.0 276.0 69.0 ... 156.0 277.0 16.0

Размеры без координат: x, y

Переменные данных:

CloudFraction  (x, y) float64 0.1599 0.05671 0.8624 ... 0.7757 0.7572

1 Ответ

0 голосов
/ 25 октября 2018

delgadom.

Мы можем реализовать (перемещение) биннинг для вашего примера, используя метод rolling.Простым способом наложения на ось x является

In [14]: dsa.rolling(x=2).mean().isel(x=slice(1, None, 2))
Out[14]: 
<xarray.Dataset>
Dimensions:        (x: 2, y: 4)
Coordinates:
    latitude       (x, y) float64 9.0 61.0 58.0 57.0 23.0 38.0 10.0 75.0
    longitude      (x, y) float64 198.0 177.0 303.0 71.0 163.0 213.0 55.0 102.0
Dimensions without coordinates: x, y
Data variables:
    CloudFraction  (x, y) float64 0.2882 0.7061 0.9226 ... 0.5084 0.2377 0.6352

. На самом деле скользящее среднее вычисляется с размером окна 2, а затем выполняется выборка с шагом 2.

Поскольку операция mean выполняетсялинейный, вы можете сделать то же самое для оси Y последовательно.

Вышеуказанная операция тратит немного вычислительных ресурсов, поскольку мы используем только половину вычисленных значений.Чтобы избежать этого, мы можем вместо этого использовать метод construct,

In [18]: dsa.rolling(x=2).construct('tmp').isel(x=slice(1, None, 2)).mean('tmp')
...: 
Out[18]: 
<xarray.Dataset>
Dimensions:        (x: 2, y: 4)

Coordinates:
    latitude       (x, y) float64 9.0 61.0 58.0 57.0 23.0 38.0 10.0 75.0
    longitude      (x, y) float64 198.0 177.0 303.0 71.0 163.0 213.0 55.0 102.0
Dimensions without coordinates: x, y
Data variables:
    CloudFraction  (x, y) float64 0.2882 0.7061 0.9226 ... 0.5084 0.2377 0.6352

Подробнее о методе прокатки см. На официальной странице http://xarray.pydata.org/en/stable/computation.html#rolling-window-operations

Лично я думаю, что это будетхорошо, если для xarray для этой цели есть метод bin.Если вы не против внести свой вклад, давайте обсудим на странице проблемы Github.

...