【问题标题】:Is it possible to vectorize scipy fsolve?是否可以矢量化 scipy fsolve?
【发布时间】:2019-12-18 04:59:27
【问题描述】:

我知道如何在 scipy 中使用 fsolve

from scipy.optimize import fsolve
import numpy as np
k=4
def equations(p):
    x,y=p
    eq_1 = x+y-k
    eq_2 = x-y
    return (eq_1,eq_2)
fsolve(equations, (0,0))

但是如果 k 是一个 numpy 数组,我不知道如何向量化这个函数。 (对于不同的 k 值,我可以循环执行此操作,但如果会花费很多时间)。 有没有类似的解决方案:

from scipy.optimize import fsolve
import numpy as np
k=np.arange(10000)
def equations(p):
    x,y=p
    eq_1 = x+y-k
    eq_2 = x-y
    return (eq_1,eq_2)
fsolve(equations, (np.zeros(10000),np.zeros(10000)))

如果您有任何想法,非常感谢

编辑: 你们中的一些人在下面给出的链接增加了计算时间,因为每一行都不必独立。 例如,您可以测试这两个代码:

s=1000

#With array
t0=time.time()
k=np.arange(s)
def equations(p):
    eq_1 = p**2-k
    return (eq_1)
res=fsolve(equations, np.ones((s)))
print(time.time()-t0)

#With loop
t0=time.time()
res=np.zeros((s))
i=0
def equations(p):
    eq_1 = p**2-i
    return (eq_1)
while i<s:
    res[i]=fsolve(equations, 1)[0]
    i+=1
print(time.time()-t0)

结果

10.85175347328186
0.05588793754577637

有没有办法避免循环,但使用矢量化功能保持良好的速度

【问题讨论】:

  • 这能回答你的问题吗? Is there a way I can vectorize fsolve?
  • 这看起来像是重复的。你检查了吗?
  • 谢谢,我已经检查了那个链接。但在那种情况下, fsolve 可能会非常慢,因为它会认为每行都没有必要独立。有没有办法告诉 fsolve 他可以对 k[i] 的每个值分别计算 x[i] 和 y[i],并且 (x[i],y[i]) 与 (x[ j],y[j]).

标签: python numpy scipy vectorization


【解决方案1】:

不直接。

虽然有 cython_optimize 接口,https://docs.scipy.org/doc/scipy/reference/optimize.cython_optimize.html

因此,您可以使用 cython 并手动实现循环。虽然是 YMMV

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2014-02-11
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多