我正在尝试同情,我遇到了一个我无法解决的问题。
使用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做的那样。我该怎么做?
答案 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来实现。
我正在使用问题正文中的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, ...]
答案 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)]