xarray создать набор данных из списка точек широты / долготы (не квадрата!) - PullRequest
0 голосов
/ 11 февраля 2020

Мне нужно создать набор данных из нерегулярного списка широт / долгот. Они были собраны в список «пикселей», которые мне нужно распаковать и преобразовать обратно в обычную сетку широты / долготы. Поскольку значения данных не являются полными для каждого пикселя в сетке, мне нужно заполнить отсутствующие значения как np.nan.

У меня проблемы с созданием xr.Dataset с неправильным списком широтных точек (пикселей).

Воспроизводимый пример:

Создайте пример того, как выглядят мои данные

Примечание: данные не полные, они имеют форму (99,), и поэтому я не могу просто изменить данные, чтобы они соответствовали уникальным широтам / долготам.

import numpy as np
import xarray as xr

unique_latitudes = np.arange(0, 10)
unique_longitudes = np.arange(0, 10)
_ = np.array((np.meshgrid(latitudes, longitudes))).T.reshape(-1, 2)

# we don't have a complete grid of pixels
pixels = _[:99]
latitudes = pixels[:, 0]
longitudes = pixels[:, 1]
pixel_id = [i for i in range(len(pixels))]

# there is one missing datapoint (only 99 pixels so can't simply reshape data)
data = np.random.choice([0,1,2], (pixels.shape[0]))
coords = {'pixel': pixels}
dims = ['pixel']

xr.Dataset({'data': (dims, data)})

Out[]:
<xarray.Dataset>
Dimensions:  (pixel: 99)
Dimensions without coordinates: pixel
Data variables:
    data     (pixel) int64 1 1 2 0 1 0 1 1 0 1 1 2 1 ... 2 2 0 0 1 2 1 2 0 1 1 2

Это как насколько я получил с моими данными. У меня есть массив длиной 99. Но каждое из этих значений соответствует одной широте и одной долготе.

pixels[:5]

Out[]:
array([[0, 0],
       [0, 1],
       [0, 2],
       [0, 3],
       [0, 4]])

Я хочу получить xr.Dataset с соответствующим образом помеченными lat / lon координатами

data = np.random.choice([0,1,2], (100)).astype('float')
data = data.reshape(len(unique_latitudes), len(unique_longitudes))
# remember there is one missing data point in the above data
data[np.unravel_index(99, data.shape)] = np.nan

correct_dims = ['lat', 'lon']
correct_coords = {'lat': unique_latitudes, 'lon': unique_longitudes}
correct_ds = xr.Dataset({'data': (correct_dims, data)}, coords=correct_coords)

correct_ds

Out[]:
<xarray.Dataset>
Dimensions:  (lat: 10, lon: 10)
Coordinates:
  * lat      (lat) int64 0 1 2 3 4 5 6 7 8 9
  * lon      (lon) int64 0 1 2 3 4 5 6 7 8 9
Data variables:
    data     (lat, lon) float64 0.0 1.0 0.0 1.0 0.0 2.0 ... 2.0 1.0 1.0 2.0 nan

...