Ich habe diesen Code:
import numpy as np
import sympy
from sympy import symbols
from sympy.utilities.autowrap import ufuncify
from sympy.utilities.lambdify import lambdify
def test(expr,a,b):
a_var, b_var = symbols("a b")
#f = ufuncify((a_var, b_var), expr, backend='numpy')
f = lambdify( (a_var, b_var), expr, 'numpy')
return f(a_var, b_var)
a = np.array([2,3])
b = np.array([1,2])
expr = a + b
print(test(expr, a, b))
die mir geben:
../anaconda3/envs/python3/lib/python3.6/site-packages/sympy/core/sympify.py:282: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
rational=rational) for x in a])
File "<string>", line 1
lambda _Dummy_52,_Dummy_53: ([3 5])
SyntaxError: invalid syntax
Wenn ich das ufuncify benutze:
...
TypeError: unhashable type: 'numpy.ndarray'
During handling of the above exception, another exception occurred:
...
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
====== UPDATE ================
Eine Lösung, die ich gefunden habe, besteht darin, sie expr
wie eine Zeichenfolge zu verwenden und dann innerhalb der Funktion Folgendes zu verwenden sympify
:
data_a = np.array([2,3])
data_b = np.array([1,2])
expr = "data_a + data_b"
def test(expr,data_a, data_b):
a, b = symbols("data_a data_b")
expr = sympify(expr)
f = lambdify( (a, b), expr, 'numpy')
return f(data_a, data_b)
und ich nehme:
[3 5]
Aber wie kann ich vermeiden, den Ausdruck als Zeichenfolge zu verwenden?
lambdify
konvertiert SymPy-Ausdrücke in NumPy-Funktionen. Sie versuchen, ein NumPy-Array in eine NumPy-Funktion zu konvertieren. Die Argumente lambdify
müssen SymPy-Objekte sein.
Du willst so etwas wie
a_var, b_var = symbols("a b")
expr = a_var + b_var
f = lambdify((a_var, b_var), expr, 'numpy')
Sie werden dann bekommen
>>> a = np.array([2,3])
>>> b = np.array([1,2])
>>> f(a, b)
array([3, 5])
Der grundlegende Codefluss für lambdify
ist SymPy Ausdruck => NumPy Funktion. Um die Dinge in Ihrem Kopf und in Ihrem Code klar zu halten, sollten Sie nur mit SymPy beginnen und die Ausdrücke so lange bearbeiten, bis Sie eine lambdifizierte Funktion haben. Verwenden Sie es dann mit Ihren NumPy-Daten. Beginnen Sie mit der Definition von Symbolnamen. Dann können Sie einen Ausdruck in Form dieser Symbole definieren, ohne eine Zeichenfolge zu verwenden (z. B. wie oben beschrieben). Sobald Sie einen Ausdruck und die Symbole haben, erstellen Sie eine lambdifizierte Funktion. Zu diesem Zeitpunkt übergeben Sie NumPy-Arrays an die Funktion. Ich empfehle, unterschiedliche Variablennamen für SymPy-Symbole / Ausdrücke und NumPy-Arrays zu verwenden, damit sie nicht verwechselt werden. Ich empfehle außerdem, für Symbole denselben Variablennamen wie für die Symbolnamen selbst zu verwenden, damit der Ausdruck beim Drucken genau so angezeigt wird, wie Sie ihn schreiben würden (z. B. unten, wenn Sie dies tun)print(expr)
Sie werden bekommen a + b
, was genau das ist, was Sie schreiben würden, um zu bekommen expr
).
In Ihrem aktualisierten Beispiel können Sie verwenden
a, b = symbols("a b")
expr = a + b
f = lambdify((a, b), expr, 'numpy')
data_a = np.array([2,3])
data_b = np.array([1,2])
f(data_a, data_b)
Beachten Sie, wie ich mit dem Erstellen von SymPy-Symbolen und einem SymPy-Ausdruck aus diesen Symbolen beginne. Dann lambdifiziere ich es. Sobald es lambdifiziert ist, habe ich die lambdifizierte Funktion ( f
). Zu diesem Zeitpunkt verwende ich SymPy überhaupt nicht mehr, sondern nur noch NumPy-Arrays (die Daten) und die Lambdified-Funktion f
.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen