данные среза xarray по нескольким измерениям - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю с данными прогноза из СГФ. Я написал следующую функцию для извлечения временных рядов из архива прогнозов:

def time_series_from_ensemble_archive(ensemble_archive, lead_time: int=0, ensemble_member: int=0):

    data = ensemble_archive

    data['age'] = (data.validityDateTime - data.as_of_datetime).astype(np.float)
    age_idx =  data['age']==lead_time

    return data[:, ensemble_member, :, :, :].values[age_idx.T, :, :]

Работает как положено:

Вот это data:

Coordinates:
  * validityDateTime    (validityDateTime) datetime64[ns] 2017-10-01 ...
  * perturbationNumber  (perturbationNumber) int32 0 1 2 3 4 5 6 7 8 9 10 11 ...
  * lon                 (lon) float64 -119.0 -118.5 -118.0 -117.5 -117.0 ...
  * lat                 (lat) float64 45.5 45.0 44.5 44.0 43.5 43.0 42.5 ...
  * as_of_datetime      (as_of_datetime) datetime64[ns] 2017-10-01 ...
Attributes:
    name:                 2 metre temperature

И с моей функцией:

temp_ts = time_series_from_ensemble_archive(data)
temp_ts.shape
(124, 10, 20)

type(temp_ts)
numpy.ndarray

Однако я чувствую, что это не самый «питонический» или «ксаррейский» подход, и было бы лучше вернуть другой объект ксаррей. Предложения по улучшению здесь? Может ли кто-нибудь предоставить решение, используя методы expand_dims или .sel?

1 Ответ

0 голосов
/ 26 ноября 2018

xarray предоставляет различные способы индексирования и выбора данных . Вы можете попробовать индексирование с именами измерений , например ::

# select using positional & boolean indices
return data[{
    'perturbationNumber': ensemble_member,
    'validityDateTime': (data['age'] == lead_time)}]

или, если lead_time на самом деле позиционный индекс, просто

# select using positional indices
return data[{
    'perturbationNumber': ensemble_member,
    'validityDateTime': lead_time}]

Если вы хотите указать индекс метки , а не их позиции, вы можете просто использовать методы .sel или .loc:

# select using labels
return data.sel(
    perturbationNumber=ensemble_member,
    validityDateTime=lead_time)

или

# select using labels and boolean indices
return data.loc[{
    'perturbationNumber': ensemble_member,
    'validityDateTime': (data['age'] == lead_time)}]

Вызов da.values - это шаг, который возвращает базовый конец массива данных xarray. Нет причин, по которым ваш код не должен работать с указанными вами индексами, индексирующими фактический xarray DataArray (без .values).

...