xarray - эффективно находит данные, отличные от 0, в многомерном объекте xarray с массивными данными - PullRequest
0 голосов
/ 07 февраля 2019

Мой объект DataArray выглядит следующим образом:

print(da_criteria_1or0_hourly)

<xarray.DataArray (time: 8760, latitude: 106, longitude: 193)>
dask.array<shape=(8760, 106, 193), dtype=int32, chunksize=(744, 106, 193)>
Coordinates:
  * latitude   (latitude) float32 -39.2 -39.149525 ... -33.950478 -33.9
  * longitude  (longitude) float32 140.8 140.84792 140.89584 ... 149.95209 150.0
  * time       (time) datetime64[ns] 2017-01-01 ... 2017-12-31T23:00:00

Данные могут быть 0 или 1. Количество данных огромно (179212080).

Я хочу получить время, широта и долгота, которые соответствуют критериям «data == 1».

Я пытался использовать функцию .sel, но она была очень медленной из-за большого числа сравнений.

for time_elem in da_criteria_1or0_hourly.coords['time'].values:
    for lat_elem in da_criteria_1or0_hourly.coords['latitude'].values:
        for lon_elem in da_criteria_1or0_hourly.coords['longitude'].values:
            val = da_criteria_1or0_hourly.sel(time=time_elem,latitude=lat_elem,longitude=lon_elem).values
            if (val == 1):
                print(time_elem, lat_elem, lon_elem, val)

Есть ли более эффективный способ?

1 Ответ

0 голосов
/ 07 февраля 2019

Возможно, вы захотите взглянуть на функцию stack.Он складывает xarray со всеми записями ниже друг друга, и тогда вы сможете фильтровать все значения, которые не соответствуют вашим требованиям.Я не тестировал его с очень большим набором данных, но он не использует тройной цикл for, поэтому может дать вам некоторое повышение скорости.

Структура кода будет выглядеть следующим образом:

    newArr = da_criteria_1or0_hourly.stack(z=('time','latitude','longitude'))
    newArr2 = newArr[newArr.values ==1]

Тогда newArr будет вашим старым массивом, а newArr2 будет содержать только ваши данные = 1 наблюдения и все равно должен содержать ваши координаты (хотя, возможно, в грязном формате).

...