Pregunta sobre sympy, python, scipy – Evaluar expresiones sympy desde una matriz de valores

34

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?

Tu respuesta

3   la respuesta
41

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

Segundo, si quieres evaluar algo numéricamente paramuchos Los valores de SymPy no son 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 quieres evaluar las expresiones.De Verdad 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: se puede encontrar una lista actualizada de formas de hacer números en SymPy en la wikihttps://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy

8

Mientrasla respuesta aceptada deja claro que el OP estaba buscandonumérico evaluación, todavía voy a señalar que uno también puede tenersimbólico evaluación utilizandosymarray:

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 unnumpy matriz internamente, pero uno lleno desympy.Expressions

Pero Symarray no atribuye un valor numérico a cada x_i, entonces, ¿cómo evaluarías la expresión para el rango especificado en la pregunta? fccoelho
@fccoelho usaría numpy para empezar, o al menoslambdify De la respuesta aceptada. Pero si por alguna razón usted realmente tiene una serie de expresiones simbólicas, probablemente tendrá que usar una lista de comprensión (ofor lazo). Tal vez hay una manera más fácil, pero nunca me molesté consymarrays mucho Mi respuesta es realmente solo aquí como una nota al margen Tobias Kienzler
-3

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)]
Tu primer ejemplo no es usar sympy de ninguna manera. El símbolo que usted define no se accede en la lambda. Además, la pregunta era sobre las matrices numpy y presumiblemente todas las operaciones especiales por elemento soportadas por numpy. Estas no son características presentes en la lista de python (lo que realmente estás usando). Krastanov

Preguntas relacionadas