我使用SymPy进行表达式的符号操作,使用NumPy对大量数据进行评估。为了加快速度,我使用sympy.lambdify,但我不能让abs工作。
import sympy
import numpy as np
x = sympy.symbols('x',real=True)
def f(x):
return 1-sympy.Abs(x)
def g(x):
return 1-sympy.sqrt(x)
fl = sympy.lambdify(x,f(x),'numpy')
gl = sympy.lambdify(x,g(x),'numpy')
gl(1) # success
gl(np.array([1,2,3]))
fl(2) # NameError: global name 'Abs' is not defined
fl(np.array([1,2,3])) # Same error
一个选项是对lambdify调用使用'sympy'参数,但是我不能使用数组。我尝试过使用sympy.abs和numpy.abs,但没有成功。
我在一个程序中使用它来解决使用逆替换和一些列表积分的繁琐积分,但是使用abs函数而不是显式处理不同区域的选项会非常方便。
sympy.Abs确实定义了
提前致谢
答案 0 :(得分:2)
这看起来像是在最新版本的SymPy中修复过的错误: https://code.google.com/p/sympy/issues/detail?id=2654 它适用于Python 2.7.9,SymPy 0.7.3和Python 3.3.5,SymPy 0.7.5。
答案 1 :(得分:1)
您可以通过将Abs
映射到abs
来解决此问题,例如lambdify(x, f(x), ["numpy", {'Abs': numpy.abs}])
。当然,如果可能的话,升级SymPy是一个更好的解决方案。