Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Symphy表达式生成python代码?_Python_Sympy - Fatal编程技术网

从Symphy表达式生成python代码?

从Symphy表达式生成python代码?,python,sympy,Python,Sympy,问题: 给定一个symphy表达式,有没有一种简单的方法来生成python代码(最后我想要一个.py或.pyc文件)?我想象这段代码将包含一个函数,该函数被给予任何必要的输入并返回表达式的值 为什么 我发现自己经常需要生成python代码来计算一些难以推导的东西,比如一个令人讨厌的非线性函数的雅可比矩阵 我可以用sympy来推导我想要的非线性的表达式:非常好。然后,我想从生成的symphy表达式生成python代码,并将该python代码保存到它自己的模块中。我以前做过,但我必须: 调用str(

问题: 给定一个symphy表达式,有没有一种简单的方法来生成python代码(最后我想要一个.py或.pyc文件)?我想象这段代码将包含一个函数,该函数被给予任何必要的输入并返回表达式的值

为什么

我发现自己经常需要生成python代码来计算一些难以推导的东西,比如一个令人讨厌的非线性函数的雅可比矩阵

我可以用sympy来推导我想要的非线性的表达式:非常好。然后,我想从生成的symphy表达式生成python代码,并将该python代码保存到它自己的模块中。我以前做过,但我必须:

  • 调用str(sympyResult)
  • 使用正则表达式执行自定义操作,使该字符串看起来像有效的python代码
  • 将此python代码写入文件
  • 我注意到Symphy具有针对其他几种语言的代码生成功能,但python没有。有没有一种简单的方法可以让python代码脱离Symphy

    我知道有几种可能但有问题的解决方法:

  • 我知道我可以在sympy表达式上调用evalf并插入我想要的数字。这有几个不可原谅的副作用:

    • 依赖性:我的代码现在依赖于sympy来运行。这很糟糕
    • 效率:sympy现在必须在每次数值计算时运行:即使我对表达式进行pickle和unpickle处理,每次仍然需要
      evalf
  • 我还知道我可以生成(比如)C代码,然后使用大量工具(python/CAPI、cython、weave、swig等)包装这些代码。然而,这意味着我的代码现在取决于是否有合适的C编译器

  • 编辑:摘要 看起来sympy.python,或者可能只是str(表达式)就是这样(请参阅smichr的答案和Oliver W的评论),它们适用于简单的标量表达式


    这对雅各比派之类的东西没有多大帮助,但似乎sympy.printing.print\ccode也会被矩阵阻塞。我认为,能够处理将矩阵打印到另一种语言的代码必须假设目标语言中支持矩阵,这对于python可能意味着依赖于numpy之类的东西的存在。如果有这样一种生成numpy代码的方法就好了,但似乎没有

    生成python代码所需的函数是
    python
    。尽管它生成python代码,但正如Oliver W所指出的,该代码需要一些调整来消除对Symphy对象的依赖

    >>> import sympy as sp
    >>> x = sp.Symbol('x')
    >>> y = sp.Symbol('y')
    >>> print(sp.python(sp.Matrix([[x**2,sp.exp(y) + x]]).jacobian([x, y])))
    x = Symbol('x')
    y = Symbol('y')
    e = MutableDenseMatrix([[2*x, 0], [1, exp(y)]])
    

    如果您不介意在代码本身中有一个SymPy依赖项,那么更好的解决方案是在代码中生成SymPy表达式并使用它进行求值。这将比使用更快,尤其是如果使用numpy


    您还可以查看如何在中直接使用打印机,
    lambdify
    使用打印机将表达式转换为lambda函数

    取决于使用Symphy生成的函数类型。大多数函数在标准模块
    math
    中具有直接等效项,有些函数也在
    numpy
    scipy.special
    中表示。如果您不想依赖Sympy,那么无论如何都必须将字符串表示复制到实际文件中,这与您现在的做法类似(如果导入了
    math
    ,字符串表示通常已经是有效的python代码)。您可以使用一个函数来自动实现这一点,该函数编写了一个有效的python文件,该文件具有该(sympy)函数,但它将不是一个非常通用的导出函数。