【问题标题】:Python: SymPy lambdify abs for use with NumPyPython:用于 NumPy 的 SymPy lambdify abs
【发布时间】:2015-01-28 07:30:32
【问题描述】:

我正在使用 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

一个选项是使用 'sympy' 参数进行lambdify 调用,但是我不能使用数组。我尝试过使用 sympy.abs 和 numpy.abs,但没有成功。

我在一个程序中使用它来解决繁琐的积分问题,使用反代换和一些表格积分,但是如果使用 abs 函数而不是显式处理不同的区域,它会非常方便。

sympy.Abs 确实定义了

提前致谢

【问题讨论】:

  • 错误告诉您abs 函数未定义。它是由sympy 定义的吗?然后在f 的定义中你需要写sympy.abs(x),而不是简单的abs(x)
  • 这对我有用(除了gl(np.array([1,2,3]) 行中缺少的括号。您使用的是哪个 Python?
  • @jme:如果我使用 sympy.abs,我会得到同样的错误。
  • @xnx:我使用 Python 2.7.3:如果它适合您,我想知道您使用的是什么版本

标签: python sympy


【解决方案1】:

这看起来像是最近版本的 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。

【讨论】:

  • 谢谢,我会更新我的 Python 和 SymPy。我是一个老 Debian 屁,通常坚持稳定。再次感谢
  • 好的 - 如果您不喜欢升级,请尝试按照 @Marius 的建议直接使用 sympy.Abs
  • 这给了我同样的错误,我为此工作了很长时间。我继续得到同样的错误是没有意义的。
【解决方案2】:

您可以通过将Abs 映射到abs 来解决此问题,例如lambdify(x, f(x), ["numpy", {'Abs': numpy.abs}])。当然,如果可能的话,升级 SymPy 是一个更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2022-11-03
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多