所以,我有这段代码
from __future__ import division, print_function
import sympy as sp
import numpy as np
from sympy.utilities.lambdify import *
u = np.random.uniform(4, 6, 500)
w, k = sp.symbols('w k')
f = sp.log((k - w) * sp.exp((k - w)**5))
l = sum(f.subs(dict(k=k)) for k in u)
现在我想l
用作的函数w
。所以我知道一些选择
z_lambdify = lambdify(w, l)
z_subs = lambda x: l.subs(w, x)
第一个函数给出一个错误
>>> z_lambdify(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <lambda>
OverflowError: math range error
>>> z_lambdify(4)
40.862695278600114
而第二个给出答案
>>> z_subs(1)
11469.9130597554
>>> z_subs(4)
40.8626952786003
我只会使用它,但是它非常慢。有什么方法可以解决此问题(修复lamdify错误或将其l
用作不太慢的函数)?
版本:Python 2.7.6,NumPy 1.8.1,SymPy 0.7.4.1
问题是:
z_lambdify = lambdify(w, l)
告诉新函数使用内置函数执行计算math
,您可以使用来检查运行情况cProfile.run('z_lambdify(1)')
;同时执行z_subs(1)
通话sympy
功能。要获得相同的行为,您应该告诉lambdify()
您使用相同的模块:
z_lambdify = lambdify(w, l, "sympy")
您应该已经在定义函数时简化了它,然后使用它NumPy
来更有效地执行计算。使用一些简单的代数,您的函数可以以“非溢出”格式重写为:
f = lambda k, w: np.log(k - w) + (k - w)**5
这样您就可以通过以下方式获得所需的答案:
f(k=u, w=1).sum()
当您f(k=u, w=1)
得到具有相同形状的数组时u
,其中每个值代表使用的每个值求值的函数的结果u
。可以使用此函数来同时评估f()
为不同的值k
和w
,即,使w
作为另一阵列的相同的形状u
,而不是使用恒定值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句