从数值数组中计算sympy表达式

41

我正在使用Sympy进行实验,但遇到了一个无法解决的问题。

使用Scipy,我可以编写表达式并对x值数组进行求值,如下所示:

import scipy
xvals = scipy.arange(-100,100,0.1)
f = lambda x: x**2
f(xvals)

使用sympy,我可以按照以下方式编写相同的表达式:

import sympy
x = sympy.symbols('x')
g = x**2

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

g.evalf(subs={x:10})

然而我不知道如何评估它用于一组x值,就像我用scipy做的那样。我应该怎么做?

4个回答

49

首先,目前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)

查看lambdify的文档字符串以获得更多详细信息。请注意,lambdify仍然存在一些问题,可能需要重写。

另外,如果您想要评估表达式很多次,可以使用sympy中的codegen/autowrap模块创建Fortran或C代码,并将其封装并从Python调用。

编辑:在wiki上可以找到有关SymPy中进行数值计算的最新方法列表 https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy


9

虽然被接受的答案清楚地表明了OP是在寻求数值评估,但我仍然要指出,通过使用symarray,也可以进行符号评估:

import sympy
xs = sympy.symarray('x', 10)
f = lambda x: x**2
f(xs)

收益率
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)

请注意,这里也使用了一个 numpy 数组,但是其中填充的是 sympy.Expr 表达式。

但是symarray并没有为每个x_i分配一个数值,那么你如何计算问题中指定的arange表达式呢? - fccoelho
@fccoelho 我会首先使用numpy,或者至少使用接受答案中的lambdify。但是如果由于某种原因你真的有一个符号表达式数组,那么你可能需要使用列表推导(或for循环)。也许有更简单的方法,但我从来没有太关注过symarray。我的回答只是作为旁注在这里。 - Tobias Kienzler

0

或者您可以通过 numpy.vectorize 完成。 我正在使用问题主体中的 xgxvals

scalar_func = lambda xx: float(g.evalf(subs={x: xx}))
vector_func = numpy.vectorize(scalar_func)
vector_func(xvals) # returns a numpy array [10000.0, 9980.01, 9960.04, ...]

-3

尝试

import sympy
x = sympy.symbols('x')
f = lambda x: x**2
print [f(k) for k in range(4)]

或者你也可以尝试

g = x**2
print [g.subs(x,k) for k in range(4)]

3
你的第一个例子没有使用sympy。你定义的符号在lambda表达式中没有被使用。此外,问题是关于numpy数组的,假设所有numpy支持的特殊逐元素操作。这些功能不在Python列表中(实际上你正在使用Python列表)。 - Krastanov

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