可以对scipy fsolve进行矢量化处理吗?

时间:2019-12-17 10:13:04

标签: python numpy scipy vectorization

我知道如何在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

有没有办法避免循环,但可以通过向量化功能保持良好的速度

1 个答案:

答案 0 :(得分:1)

不直接。

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

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