Python:SymPy lambdify abs用于NumPy

Python:SymPy lambdify abs用于NumPy,python,sympy,Python,Sympy,我使用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')

我使用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函数而不是显式处理不同的区域,则会非常方便

Abs确实是有定义的


提前感谢

这看起来像是Symphy最新版本中已修复的错误:
它可以在Python2.7.9、Sympy0.7.3和Python3.3.5、Sympy0.7.5上运行。

您可以通过将
Abs
映射到
Abs
来解决这个问题,比如
lambdify(x,f(x),[“numpy”,“Abs”:numpy.Abs])
。当然,如果可能的话,升级Symphy是一个更好的解决方案。

错误告诉您,
abs
功能未定义。它是由sympy定义的吗?然后在
f
的定义中,您需要编写
sympy.abs(x)
,而不是简单地编写
abs(x)
。这对我很有用(除了
gl(np.array([1,2,3])行中缺少的括号)
。您使用的是哪种Python?@jme:如果我使用Symphy.abs,我也会遇到同样的错误。@xnx:我使用的是Python 2.7.3:如果它对您有效,我想知道您使用的是什么版本的Tanks,我会更新我的Python和Symphy。我是一个老Debian屁,通常会坚持使用stable。再次感谢Inok-如果您不喜欢升级,请尝试使用
Symphy.abs
正如@Marius所建议的那样。这给了我同样的错误,我在这方面花了相当长的时间。我继续得到同样的错误是没有意义的。