2016-11-18 2 views
0

Из данных учебника 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 для удобства. Как всегда, я заранее благодарен

ответ

1

Я думаю, что вы хотите:

xr.ufuncs.logical_and.reduce(all_maps) 

Он применяет and операции поэлементно во всех булевых массивов одинаковой длины, и дает один результат тот же длина. Конечно, вы можете использовать logical_or или любые другие подходящие ufunc.

+0

Я уже пробовал это, но а) принимает навсегда (один раз 2м, теперь 7м (!)) по сравнению с 18 мс при выполнении его ручным способом и б) она возвращает 'нп. array', я бы предпочел 'DataArray' – TomTom101

+0

@ TomTom101: О, я вижу, я написал« np.logical_and », но теперь вижу у xarray есть свои собственные повторные реализации некоторых из ufunc. Я думаю, они не совместимы с NumPy, поэтому теперь я буду обновлять свой ответ, чтобы использовать версию xarray. Повторите попытку, и я надеюсь, что вы увидите хорошую производительность. –

+0

По-прежнему жалуется: объект AttributeError: '_UFuncDispatcher' не имеет атрибута 'reduce'' – TomTom101

1

Мы не можем кормить np.logical_and.reduce() с DataArray с, но она прекрасно работает с чистыми массивами, так что тогда я кормлю его с

all_maps = [fn(air_day[var], val).values for var, fn, val in comfy_warm] 

Я затем добавить эту карту в качестве новых переменных данных и ресэмплировать это

air_day['nice_days'] = (['time', 'lat', 'lon'], np.logical_and.reduce(all_maps))  
air_day.nice_days.resample('M', dim='time', how='sum') 
Смежные вопросы