Я привык писать векторизованные операторы и списочные выражения в Python, но у меня есть проблема, которая возникает как при «работающих» вычислениях, которые зависят от предыдущего значения в цикле, так и при выполнении оператора if.Схематически это выглядит так:
def my_loop(x, a=0.5, b=0.9):
out = np.copy(x)
prev_val = 0
for i in np.arange(x.shape[0]):
if x[i] < prev_val:
new_val = (1-a)*x[i] + a*prev_val
else:
new_val = (1-b)*x[i] + b*prev_val
out[i] = new_val
prev_val = new_val
return out
Я не смог выяснить, как можно векторизовать это (например, с помощью какого-то аккумулятора), поэтому я спрошу: есть ли способсделать это более Pythonic / быстрее?
Я видел предыдущие посты о векторизации, когда есть оператор if - обычно решаемый с помощью np.where () - но не тот, где есть «бегущее» значение, которое зависит от его предыдущего состояния ...поэтому я еще не нашел повторяющихся вопросов (и этот не о векторизации в обычном смысле, этот о «предыдущем значении», но ссылается на индексы списка),
До сих пор я пробовал np.vectorize
и numba @jit
, и они действительно работают несколько быстрее, но ни одна из них не дает мне скорости, на которую я надеюсь.Я что-то упускаю?(Может что-то с map()
?) Спасибо.
(Да, в случае a = b это становится легко!)