mac library instalar functions como python scipy sympy

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