Evaluar expresiones sympy desde una matriz de valores

Estoy experimentando con sympy y he encontrado un problema que no puedo resolver.

Usando scipy puedo escribir una expresión y evaluarla para una matriz de valores de x de la siguiente manera:

import scipy xvals = scipy.arange(-100,100,0.1) f = lambda x: x**2 f(xvals) 

Usando sympy puedo escribir la misma expresión de la siguiente manera:

 import sympy x = sympy.symbols('x') g = x**2 

Puedo evaluar esta expresión para un solo valor haciendo lo siguiente:

 g.evalf(subs={x:10}) 

Sin embargo, no puedo averiguar cómo evaluarlo para una serie de valores de x, como hice con scipy. ¿Cómo haría esto?

En primer lugar, en este momento, SymPy no garantiza el soporte para una gran cantidad de arreglos, que es lo que desea en este caso. Compruebe este informe de error http://code.google.com/p/sympy/issues/detail?id=537

Segundo, si desea evaluar algo numéricamente para muchos valores, SymPy no es la mejor opción (después de todo, es una biblioteca simbólica). Use adormecer y scipy.

Sin embargo, una razón válida para evaluar algo numéricamente será que la obtención de la expresión que se evaluará fue difícil, por lo que debe obtenerse en SymPy y luego evaluarla en NumPy / SciPy / C / Fortran. Para traducir una expresión a numpy solo usa

 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) 

Compruebe la cadena de documentos de lambdify para más detalles. Tenga en cuenta que lambdify todavía tiene algunos problemas y es posible que deba volver a escribirla.

Y solo como nota al margen, si desea evaluar las expresiones realmente muchas veces, puede usar el módulo codegen / autowrap de sympy para crear código fortran o C que se envuelve y se puede llamar desde Python.

EDITAR: Puede encontrar una lista actualizada de formas de hacer números en SymPy en la wiki https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy

Mientras que la respuesta aceptada deja en claro que el OP estaba buscando una evaluación numérica , aún señalaré que también se puede realizar una evaluación simbólica mediante el uso de symarray :

 import sympy xs = sympy.symarray('x', 10) f = lambda x: x**2 f(xs) 

rendimientos

 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) 

Tenga en cuenta que esto también utiliza una matriz numpy internamente, pero una llena de sympy.Expr essions.

tratar

 import sympy x = sympy.symbols('x') f = lambda x: x**2 print [f(k) for k in range(4)] 

o también puedes probar

 g = x**2 print [g.subs(x,k) for k in range(4)]