所以,我有这个密码
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作为一个不太慢的函数)?
版本:Python2.7.6,NumPy 1.8.1,SymPy 0.7.4.1
发布于 2014-09-11 06:07:28
回答你的问题:
问题是:
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的另一个数组传递,而不是使用常量值。
https://stackoverflow.com/questions/25779297
复制相似问题