【问题标题】:More than one module for lambdify in sympysympy 中用于lambdify 的多个模块
【发布时间】:2014-08-25 22:36:12
【问题描述】:

我试图让lambdify 理解使用modules 关键字参数期望不止一种类型的输入。根据lambdify的源代码(http://docs.sympy.org/dev/_modules/sympy/utilities/lambdify.html),这可以通过使用参数列表来完成,但我不能这样做。

import sympy
from sympy import lambdify
x,y=sympy.symbols('x y')
from sympy.parsing.sympy_parser import parse_expr
func=lambdify(x,parse_expr(exp(x)),modules=["numpy","sympy"])

func(array([3,4]))

给予

array([ 20.08553692,  54.59815003])

但是当我尝试时

func(y)

我得到一个

Attribute error:exp

我在这里做错了什么? func 不应该同时接受 numpy 和 sympy 类型吗? 任何帮助表示赞赏!

【问题讨论】:

    标签: python arrays numpy sympy symbolic-math


    【解决方案1】:

    模块不会分派或类似的东西。 lambdify 的工作方式是它创建

    lambda x: exp(x)
    

    其中exp 来自您选择的模块的命名空间。 lambdify(x, exp(x), ['numpy', 'sympy']) 大致相当于

    from sympy import *
    from numpy import *
    # Various name replacements for differences in numpy naming conventions, like
    # asin = arcsin
    return lambda x: exp(x)
    

    如果您想提供一个自定义的分派函数,您可以使用类似 Saullo Castro 的示例。你也可以通过提供一个字典来使用它和lambdify,比如

    import numpy as np
    import sympy
    
    def myexp(x):
        if isinstance(x, np.ndarray):
            return np.exp(x)
        else:
            return sympy.exp(x)
    
    func = lambdify(x, exp(x), [{'exp': myexp}, 'numpy'])
    

    这给了

    >>> func(np.array([1, 2]))
    array([ 2.71828183,  7.3890561 ])
    >>> func(sympy.Symbol('y'))
    exp(y)
    

    【讨论】:

    • 为什么必须在该列表中传递'numpy'?我在docs 中看到了相同的语法。但是这个:lambdify(x, exp(x), {'exp': myexp}) 也可以。
    • 对于exp(x),包括 numpy 是不必要的,但如果你包括任何其他函数,你将需要它来将其转换为相应的 numpy 函数,因为你绕过了默认的第三个参数 ' numpy'。
    【解决方案2】:

    文档说modules 参数将优先考虑首先出现的模块,在这种情况下是"numpy"。因此,如果两个模块具有相同的功能,则总是使用第一个。

    一个好的方法是:

    import numpy as np
    
    def func(x):
        if isinstance(x, np.ndarray):
            return np.exp(x)
        else:
            return sympy.exp(x)
    

    【讨论】:

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