[英]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做到这一点。 我正在使用问题正文中的x
, g
和xvals
。
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.