从Symphy表达式生成python代码?
问题: 给定一个symphy表达式,有没有一种简单的方法来生成python代码(最后我想要一个.py或.pyc文件)?我想象这段代码将包含一个函数,该函数被给予任何必要的输入并返回表达式的值 为什么 我发现自己经常需要生成python代码来计算一些难以推导的东西,比如一个令人讨厌的非线性函数的雅可比矩阵 我可以用sympy来推导我想要的非线性的表达式:非常好。然后,我想从生成的symphy表达式生成python代码,并将该python代码保存到它自己的模块中。我以前做过,但我必须:从Symphy表达式生成python代码?,python,sympy,Python,Sympy,问题: 给定一个symphy表达式,有没有一种简单的方法来生成python代码(最后我想要一个.py或.pyc文件)?我想象这段代码将包含一个函数,该函数被给予任何必要的输入并返回表达式的值 为什么 我发现自己经常需要生成python代码来计算一些难以推导的东西,比如一个令人讨厌的非线性函数的雅可比矩阵 我可以用sympy来推导我想要的非线性的表达式:非常好。然后,我想从生成的symphy表达式生成python代码,并将该python代码保存到它自己的模块中。我以前做过,但我必须: 调用str(
- 依赖性:我的代码现在依赖于sympy来运行。这很糟糕
- 效率:sympy现在必须在每次数值计算时运行:即使我对表达式进行pickle和unpickle处理,每次仍然需要
evalf
这对雅各比派之类的东西没有多大帮助,但似乎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)函数,但它将不是一个非常通用的导出函数。