我知道如何在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
有没有办法避免循环,但可以通过向量化功能保持良好的速度
答案 0 :(得分:1)
不直接。
虽然有cython_optimize接口,https://docs.scipy.org/doc/scipy/reference/optimize.cython_optimize.html
因此,您可以使用cython并手动实现循环。虽然是YMMV