从sympy表达式生成python代码?

11
给定一个sympy表达式,是否有一种简单的方法生成Python代码(最终我想要一个.py或者.pyc文件)?我想这个代码将包含一个函数,该函数提供任何必要的输入,并返回表达式的值。我经常需要生成Python代码来计算一些很难推导的东西,比如nasty nonlinear function的Jacobian矩阵。 我可以使用sympy为我想要的非线性功能派生表达式。然后我想从所得到的sympy表达式生成Python代码,并将该Python代码保存到自己的模块中。Sympy具有其他几种语言的代码生成能力,但没有Python。 有没有一种简单的方法从sympy中获取Python代码呢?看起来 sympy.python 或者只是 str(expression) 是目前可用的方式(参见 smichr 的答案和 Oliver W. 的评论),并且它们适用于简单的标量表达式。
但这对于像雅各比矩阵之类的东西没有什么帮助,而 sympy.printing.print_ccode 对于矩阵也无法处理。我想,能够处理将矩阵打印到另一种语言的代码,必须假定目标语言支持矩阵,对于 Python 而言,这可能意味着依赖于诸如 numpy 等库的存在。如果存在一种生成 numpy 代码的方法,那就太好了,但好像并没有这样的方法。

取决于您使用Sympy生成的函数类型。大多数函数在标准模块“math”中都有直接等效物,有些也在“numpy”或“scipy.special”中表示。如果您不想依赖Sympy,那么您仍然需要将字符串表示复制到实际文件中,类似于您现在所做的方式(给定已导入“math”,字符串表示通常是有效的Python代码)。您可以使用编写包含该(sympy)函数的有效python文件的函数自动化此过程,但这样它就不会是非常通用的导出函数。 - Oliver W.
2个回答

11
如果您不介意在代码本身中使用SymPy依赖项,更好的解决方案是在代码中生成SymPy表达式并使用lambdify来评估它。这比使用evalf要快得多,特别是如果您使用numpy。您还可以直接使用sympy.printing.lambdarepr中的打印机,这就是lambdify用于将表达式转换为lambda函数的方法。

请问您能否给出一个代码示例,展示一下它的样子? - Andreas Schuldei

8
您要查找的用于生成Python代码的函数是python。尽管它生成Python代码,但需要做一些调整才能消除对SymPy对象的依赖,正如Oliver W所指出的那样。
>>> 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)]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接