Evaluar la expresión sympy a partir de 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 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 matriz de valores x, como hice con scipy. ¿Cómo haría esto?
3 answers
En primer lugar, por el momento SymPy no garantiza el soporte para matrices numpy, que es lo que desea en este caso. Compruebe este informe de error 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). Usa numpy y scipy.
Sin embargo, una razón válida para evaluar algo numéricamente será que derivar la expresión a ser evaluado fue difícil por lo que se deriva en SymPy y luego evaluarlo en NumPy/SciPy/C/Fortran. Para traducir una expresión a numpy simplemente use
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 el docstring de lambdify para más detalles. Tenga en cuenta que lambdify todavía tiene algunos problemas y puede necesitar una reescritura.
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 de Python.
EDITAR: Una lista actualizada de formas de hacer numéricos en SymPy se puede encontrar en el wiki https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-11 17:38:42
Mientras que la respuesta aceptada deja claro que el OP estaba buscando evaluación numérica , aún señalaré que uno también puede tener evaluación simbólica usando symarray
:
import sympy
xs = sympy.symarray('x', 10)
f = lambda x: x**2
f(xs)
Rinde
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 un array numpy
internamente, pero uno lleno de essions sympy.Expr
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:29
Intenta
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)]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-21 05:26:51