xarray - возвращает данные, которые соответствуют определенным критериям, без использования цикла for - PullRequest
0 голосов
/ 07 февраля 2019

Я работаю с многомерными данными da_criteria_1or0_hourly.

Данные (переменные) либо 1, либо 0.

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

Данные столь же массивны, как 179212080.

Я не уверен, какой метод на xarray мне следует использовать, чтобы получить новый объект xarray, который возвращает только те данные, которые 1 (0 можно присвоить NaN илиупал).

Я пытался распечатать данные для каждой координаты, используя sel, используя FOR LOOP, но это было очень медленно.Это может занять вечность.

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

Если я правильно понял вашу проблему, xarray.Dataset.where должен быть путь:

da_criteria_1or0_hourly.where(da_criteria_1or0_hourly == 1)

Это вернет новый xarray, где каждая запись, которая не была 1, теперь NaN.

Сравнение времени для xarray 50x50x50:

для циклов: ~ 56,9456 с

where: ~ 00,0020 с

...