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?

Author: mgoi, 2012-05-21

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

 39
Author: Krastanov,
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 numpyinternamente, pero uno lleno de essions sympy.Expr.

 7
Author: Tobias Kienzler,
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)]
 -3
Author: gsagrawal,
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