从一组值中评估sympy表达式

时间:2012-05-21 02:17:47

标签: python scipy 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 个答案:

答案 0 :(得分:41)

首先,目前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的docstring以获取更多详细信息。请注意,lambdify仍然存在一些问题,可能需要重写。

正如旁注,如果你想多次评估表达式真的,你可以使用sympy中的codegen / autowrap模块来创建被包装的fortran或C代码。可以从python中调用。

编辑:可以在维基https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy

上找到SymPy中数字方式的更新列表

答案 1 :(得分:8)

虽然the accepted answer清楚表明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次。

答案 2 :(得分: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 :(得分:-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)]