Frage an python, sympy, scipy – Werten Sie den Sympy-Ausdruck aus einem Array von Werten aus

34

Ich experimentiere mit Sympy und bin auf ein Problem gestoßen, das ich nicht lösen kann.

Mit scipy kann ich einen Ausdruck schreiben und wie folgt für ein Array von x-Werten auswerten:

import scipy
xvals = scipy.arange(-100,100,0.1)
f = lambda x: x**2
f(xvals)

Mit sympy kann ich den gleichen Ausdruck wie folgt schreiben:

import sympy
x = sympy.symbols('x')
g = x**2

Ich kann diesen Ausdruck für einen einzelnen Wert folgendermaßen auswerten:

g.evalf(subs={x:10})

Allerdings kann ich nicht herausfinden, wie ich es für ein Array von x-Werten auswerten kann, wie ich es mit scipy getan habe. Wie würde ich das machen?

Deine Antwort

3   die antwort
41

was in diesem Fall gewünscht wird. Überprüfen Sie diesen Fehlerberichthttp://code.google.com/p/sympy/issues/detail?id=537

Zweitens, wenn Sie etwas numerisch auswerten möchtenviele Werte SymPy ist nicht die beste Wahl (es ist schließlich eine symbolische Bibliothek). Verwenden Sie Numpy und Scipy.

Ein triftiger Grund für eine numerische Bewertung ist jedoch, dass das Ableiten des zu bewertenden Ausdrucks schwierig war. Sie können ihn in SymPy ableiten und dann in NumPy / SciPy / C / Fortran bewerten. Verwenden Sie einfach, um einen Ausdruck in numpy zu übersetzen

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)

Weitere Informationen finden Sie in der Dokumentation von lambdify. Beachten Sie, dass Lambdify noch einige Probleme aufweist und möglicherweise neu geschrieben werden muss.

Und nur als Randnotiz, wenn Sie die Ausdrücke auswerten möchtenJa wirklich Oft können Sie das Codegen- / Autowrap-Modul von Sympy verwenden, um Fortran- oder C-Code zu erstellen, der in Python eingebunden und aufrufbar ist.

BEARBEITEN: Im Wiki finden Sie eine Liste der aktualisierten Methoden zur numerischen Eingabe in SymPyhttps://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy

8

Währenddie akzeptierte Antwort macht deutlich, dass das OP gesucht hatnumerisch auswertung werde ich noch darauf hinweisen, dass man das auch haben kannsymbolisch Auswertung mitsymarray:

import sympy
xs = sympy.symarray('x', 10)
f = lambda x: x**2
f(xs)

Ausbeuten

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)

Beachten Sie, dass hierbei auch einnumpy Array intern, aber eines gefüllt mitsympy.Expressionen.

Symarray weist jedoch nicht jedem x_i einen numerischen Wert zu. Wie würden Sie also den Ausdruck für den in der Frage angegebenen Bereich bewerten? fccoelho
@fccoelho Ich würde numpy verwenden, um damit zu beginnen, oder zumindestlambdify aus der akzeptierten Antwort. Aber wenn Sie aus irgendeinem Grund wirklich eine Reihe symbolischer Ausdrücke haben, müssen Sie wahrscheinlich ein Listenverständnis verwenden (oderfor Schleife). Vielleicht gibt es einen einfacheren Weg, aber ich habe mich nie darum gekümmertsymarrays viel. Meine Antwort ist hier eigentlich nur als Nebenbemerkung Tobias Kienzler
-3

Versuchen

import sympy
x = sympy.symbols('x')
f = lambda x: x**2
print [f(k) for k in range(4)]

oder du kannst es auch versuchen

g = x**2
print [g.subs(x,k) for k in range(4)]
Ihr erstes Beispiel verwendet Sympy in keiner Weise. Auf das von Ihnen definierte Symbol wird im Lambda nicht zugegriffen. Darüber hinaus ging es um numpy-Arrays und vermutlich um alle speziellen Per-Element-Operationen, die von numpy unterstützt werden. Dies sind keine Funktionen in der Liste von Python (was Sie tatsächlich verwenden). Krastanov

Verwandte Fragen