【问题标题】:Vectorizing root finding in numpy在 numpy 中矢量化根查找
【发布时间】:2015-11-12 15:29:56
【问题描述】:

我需要运行一个函数来查找方程的根,该方程依赖于大量数据中的一个参数(实际方程要复杂得多,但形式上是等效的)。

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

矢量化方便吗? 我尝试使用 numpy.vectorize(f) 效果很好,但我认为它的速度与 python for 循环的速度相同。

是否有某种手动矢量化来更好地利用 numpy 数组计算的强大功能?

【问题讨论】:

  • numpy.vectorize 是 for 循环的包装器,因此在您的情况下它是无用的。这里的问题是函数brentq 只为标量编写,正如另一个topic 中所讨论的那样。正如那里所建议的那样,您最好使用简单的for 列表理解。
  • 我不确定它是否有帮助,但您可以尝试使用scipy.optimize.fsolve,因为它接受矢量化输入。

标签: python numpy scipy vectorization mathematical-optimization


【解决方案1】:

如果它只是一个单参数函数,您可以只插值反函数(制表 x 和 y,插值 x 与 y,在 y 的目标值处评估插值器)。

不,手动矢量化不会让您避免 python 循环(除非您想在编译级别上破解并在 brentq 或 fsolve 的已编译部分周围包装 C 级别循环 --- 甚至可能比插值反函数慢。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多