从一组值中评估sympy表达式

mgo*_*goi 35 python sympy scipy

我正在试验同情,我遇到了一个我无法解决的问题.

使用scipy我可以编写一个表达式并为其计算x值的数组,如下所示:

import scipy
xvals = scipy.arange(-100,100,0.1)
f = lambda x: x**2
f(xvals)
Run Code Online (Sandbox Code Playgroud)

使用sympy我可以写相同的表达式如下:

import sympy
x = sympy.symbols('x')
g = x**2
Run Code Online (Sandbox Code Playgroud)

我可以通过执行以下操作来评估此表达式的单个值:

g.evalf(subs={x:10})
Run Code Online (Sandbox Code Playgroud)

但是我无法弄清楚如何评估x值的数组,就像我用scipy做的那样.我该怎么做?

Kra*_*nov 42

首先,目前SymPy并不保证支持numpy数组,这是你想要的.请查看此错误报告http://code.google.com/p/sympy/issues/detail?id=537

第二,如果你想用数值来评估许多值,SymPy不是最好的选择(它毕竟是一个符号库).使用numpy和scipy.

但是,以数字方式评估某些内容的正当理由是,导出要评估的表达式很难,因此您可以在SymPy中派生它,然后在NumPy/SciPy/C/Fortran中对其进行评估.要将表达式转换为numpy,请使用

from sympy.utilities.lambdify import lambdify
func = lambdify(x, big_expression_containing_x,'numpy') # returns a numpy-ready function
numpy_array_of_results = func(numpy_array_of_arguments)
Run Code Online (Sandbox Code Playgroud)

检查lambdify的docstring以获取更多详细信息.请注意,lambdify仍然存在一些问题,可能需要重写.

而且,正如一个侧面说明,如果你想计算表达式真的很多次,你可以为了创建一个包,并从Python中调用FORTRAN语言或C语言使用的代码生成/ autowrap模块从sympy.

编辑:可以在维基上找到SymPy数字方法的更新列表https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy


Tob*_*ler 8

虽然接受的答案清楚表明OP正在寻找数值评估,但我仍然会指出,人们也可以通过使用以下方式进行符号评估symarray:

import sympy
xs = sympy.symarray('x', 10)
f = lambda x: x**2
f(xs)
Run Code Online (Sandbox Code Playgroud)

产量

array([x_0**2, x_1**2, x_2**2, x_3**2, x_4**2, x_5**2, x_6**2, x_7**2,
       x_8**2, x_9**2], dtype=object)
Run Code Online (Sandbox Code Playgroud)

请注意,这也在numpy内部使用数组,但其中一个数组填充了sympy.Expressions.