繁体   English   中英

从值数组评估sympy表达式

[英]Evaluate sympy expression from an array of values

我正在试验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})

但是我无法像我使用scipy一样,想出如何对x值数组进行评估。 我该怎么做?

首先,目前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仍然存在一些问题,可能需要重写。

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

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

尽管公认的答案清楚地表明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 essions。

或者,您可以通过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, ...]

尝试

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)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM