Из данных учебника xarray, я хочу, чтобы извлечь DataArray
, содержащее количество теплых дней в месяце, определяются как между 22 и 30 градусами Цельсием:Фильтрации по нескольким условиям
airtemps = xr.tutorial.load_dataset('air_temperature')
airtemps = airtemps.sel(time=slice('2013-01-01', '2013-12-31'))
airtemps['air'] = airtemps.air - 273.15
air_day = airtemps.resample('1D', 'time', how='mean')
# Define multiple conditions - How can this be done programatically?
Я сейчас ищу способ создать эту карту ниже программно, а также возможность добавить больше условий
meets_condition = (air_day.air > 22) & (air_day.air < 30)
warm_days = meets_condition.resample('M', dim='time', how='sum')
условия могут быть определены следующим образом:
not_cold = ('air', operator.ge, 22)
not_hot = ('air', operator.le, 30)
я могу сделать это просто с одним условием:
variable, operator_fn, value = not_cold
meets_condition = operator_fn(air_day[variable], value)
warm_but_possibly_hot_days = meets_condition.resample('M', dim='time', how='sum')
Но я struggeling добавление нескольких динамически. Я могу это сделать
comfy_warm = [not_cold, not_hot]
all_maps = [fn(air_day[var], val) for var, fn, val in comfy_warm]
(all_maps[0] & all_maps[1]).resample('M', dim='time', how='sum')
Но я ищу сделать что-л. как этот
np.all(all_maps).resample('M', dim='time', how='sum')
Вот gist для удобства. Как всегда, я заранее благодарен
Я уже пробовал это, но а) принимает навсегда (один раз 2м, теперь 7м (!)) по сравнению с 18 мс при выполнении его ручным способом и б) она возвращает 'нп. array', я бы предпочел 'DataArray' – TomTom101
@ TomTom101: О, я вижу, я написал« np.logical_and », но теперь вижу у xarray есть свои собственные повторные реализации некоторых из ufunc. Я думаю, они не совместимы с NumPy, поэтому теперь я буду обновлять свой ответ, чтобы использовать версию xarray. Повторите попытку, и я надеюсь, что вы увидите хорошую производительность. –
По-прежнему жалуется: объект AttributeError: '_UFuncDispatcher' не имеет атрибута 'reduce'' – TomTom101