python - library - Evaluar la expresión de Sympy de una matriz de valores
scipy python 2.7 windows 64 (3)
Estoy experimentando con Sympy y me he topado con un problema que no puedo resolver.
Usando scipy puedo escribir una expresión y evaluarla para una matriz de valores 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 descifrar cómo evaluarlo para una matriz de valores x, como hice con scipy. ¿Cómo haría esto?
En primer lugar, en este momento SymPy no garantiza el soporte para matrices numpy, que es lo que quiere en este caso. Consulte este informe de errores http://code.google.com/p/sympy/issues/detail?id=537
En segundo lugar, 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 numpy y scipy.
Sin embargo, una razón válida para evaluar algo numéricamente será que la derivación de la expresión a evaluar fue difícil, por lo que se deriva en SymPy y luego se evalúa en NumPy / SciPy / C / Fortran. Para traducir una expresión a numpy simplemente 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)
Verifique el docstring de lambdify para más detalles. Tenga en cuenta que lambdify todavía tiene algunos problemas y puede necesitar una reescritura.
Y como nota al margen, si quiere evaluar las expresiones realmente muchas veces, puede usar el módulo codegen / autowrap de sympy para crear un código fortran o C que esté empaquetado y pueda llamarse desde python.
EDIT: una lista de actualizaciones de formas de hacer numéricos en SymPy se puede encontrar en la wiki https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy
Si bien la respuesta aceptada deja en claro que el PO estaba buscando una evaluación numérica , aún señalaré que también se puede tener 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 usa una matriz numpy
internamente, pero una llena con 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)]