Векторизация поиска корней в numpy

Мне нужно запустить функцию, которая находит корень уравнения, зависящего от одного параметра, на большом наборе данных (настоящее уравнение намного сложнее, но формально эквивалентно).

def f(x):
    return numpy.optimize.brentq(lambda y:numpy.exp(-abs(x)*y)-y,0,1)

Удобно ли его векторизовать? Я пытался использовать numpy.vectorize(f), который отлично работает, но я думаю, что с той же скоростью, что и у цикла python for.

Есть ли какая-то ручная векторизация, чтобы лучше использовать возможности вычисления массива numpy?


person IacopoTorre    schedule 19.08.2015    source источник
comment
numpy.vectorize является оболочкой цикла for, поэтому в вашем случае он бесполезен. Проблема здесь в том, что функция brentq написана только для скаляров, как обсуждалось в другом тема. Как было предложено там, вам лучше использовать простое понимание списка for.   -  person yevgeniy    schedule 19.08.2015
comment
Я не уверен, что это может помочь, но вы можете попробовать поиграть с scipy.optimize.fsolve, так как он принимает векторизованный ввод.   -  person yevgeniy    schedule 19.08.2015
comment
см. также github.com/scipy/scipy/issues/7242   -  person Jason S    schedule 03.05.2017


Ответы (1)


Если это всего лишь функция с одним параметром, вы можете просто интерполировать обратную функцию (свести в таблицу x и y, интерполировать x и y, оценить интерполятор при целевых значениях y).

И нет, ручная векторизация не позволит вам избежать цикла Python (если вы не хотите взломать скомпилированный уровень и обернуть цикл уровня C вокруг скомпилированной части brentq или fsolve --- и даже это, вероятно, медленнее, чем интерполяция обратная функция.)

person ev-br    schedule 19.08.2015