【问题标题】:How to lambdify a SymPy expression containing the erf function for use with NumPy如何对包含 erf 函数的 SymPy 表达式进行lambdify 以与 NumPy 一起使用
【发布时间】:2014-09-30 18:15:20
【问题描述】:

我想用 SymPy 对包含 erf 函数的符号表达式进行 lambdify。这可以对标量参数进行如下操作:

log_normal = 0.5 + 0.5 * sym.erf((sym.log(x) - mu) / sym.sqrt(2 * sigma**2))
F = sym.lambdify([x, mu, sigma], log_normal)
F(1.0, 0.0, 1.0)

我想对以上内容进行矢量化。通常我会这样做...

log_normal = 0.5 + 0.5 * sym.erf((sym.log(x) - mu) / sym.sqrt(2 * sigma**2))
vector_F = sym.lambdify([x, mu, sigma], log_normal, modules='numpy')
vector_F(1.0, 0.0, 1.0)

然而,上面提出了一个NameError...

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-29-14adde48d4a1> in <module>()
----> 1 vector_F(1.0, 0.0, 1.0)

/Users/drpugh/anaconda/lib/python2.7/site-packages/numpy/__init__.pyc in <lambda>(x, mu,     sigma)

NameError: global name 'erf' is not defined

这是一个错误,还是我遗漏了一些微不足道的东西?

【问题讨论】:

    标签: python numpy sympy


    【解决方案1】:

    你告诉lambdify它只有numpy作为一个模块来玩;给它一个erf 的来源。 IOW,你有

    >>> vector_F = sym.lambdify([x, mu, sigma], log_normal, modules=['numpy'])
    >>> vector_F(1.0, 0.0, 1.0)
    Traceback (most recent call last):
      File "<ipython-input-10-14adde48d4a1>", line 1, in <module>
        vector_F(1.0, 0.0, 1.0)
      File "<string>", line 1, in <lambda>
    NameError: global name 'erf' is not defined
    

    但是

    >>> vector_F = sym.lambdify([x, mu, sigma], log_normal, modules=['numpy', 'sympy'])
    >>> vector_F(1.0, 0.0, 1.0)
    0.500000000000000
    

    >>> vector_F = sym.lambdify([x, mu, sigma], log_normal, modules=['numpy', 'math'])
    >>> vector_F(1.0, 0.0, 1.0)
    0.5
    

    或您喜欢的erf,具体取决于您想要sympy.core.numbers.Float 还是float

    【讨论】:

    • 你也可以使用modules=['numpy', {'erf': scipy.special.erf}]来使用scipyerf
    • @asmeurer 我认为,这个评论应该是一个单独的答案。使用erf 对我不起作用。但是,使用您的解决方案可以。
    【解决方案2】:

    从 SymPy 1.3 开始,lambdify 自动支持 scipy。如果省略 modules 参数,它会自动添加 scipy。或者你可以使用modules=['numpy', 'scipy']

    >>> log_normal = 0.5 + 0.5 * sym.erf((sym.log(x) - mu) / sym.sqrt(2 * sigma**2))
    >>> vector_F = sym.lambdify([x, mu, sigma], log_normal)
    >>> vector_F(1.0, 0.0, 1.0)
    0.5
    

    一般来说,要支持lambdify 不知道的函数,请将其作为字典添加到modules 参数中。 modules 参数确定运行lambdified 函数的命名空间。请参阅lambdify documentation。例如,在 SymPy

    >>> import scipy.special
    >>> vector_F = sym.lambdify([x, mu, sigma], log_normal, modules=['numpy', {'erf': scipy.special.erf}])
    >>> vector_F(1.0, 0.0, 1.0)
    0.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      相关资源
      最近更新 更多