Pregunta Evaluar la expresión de Sympy de una matriz de valores


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?


32
2018-05-21 02:17


origen


Respuestas:


En primer lugar, en este momento SymPy no garantiza el soporte para matrices numpy, que es lo que quiere en este caso. Verifique 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 (es una biblioteca simbólica después de todo). 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 solo como una nota al margen, si quieres evaluar las expresiones De Verdad muchas veces, puede usar el módulo codegen / autowrap de sympy para crear un código fortran o C que esté envuelto 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


38
2018-05-21 10:55



Mientras la respuesta aceptada deja en claro que el OP estaba buscando numérico evaluación, todavía señalaré que uno también puede tener simbólico evaluación mediante el uso 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 numpy matriz internamente, pero una llena de sympy.ExprEsiones.


7
2018-04-10 07:43



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)]

-3
2018-05-21 05:26