38

我正在尝试 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

4 回答 4

46

首先,目前 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 模块来创建包装和可从 python 调用的 fortran 或 C 代码。

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

于 2012-05-21T10:55:21.380 回答
8

虽然接受的答案清楚地表明 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.Expressions。

于 2013-04-10T07:43:51.580 回答
0

或者你可以通过 numpy.vectorize 来实现。我正在使用x,gxvals来自问题主体。

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, ...]
于 2019-09-10T15:13:58.463 回答
-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)]
于 2012-05-21T05:26:51.443 回答