In Sympy 0.7.6 hatte ich keine Probleme mit dem folgenden Code für die Module = 'Sympy' und die Module = 'numpy' Optionen. Jetzt mit sympy v0.1, die Auswertung mit Modulen = ‚numpy‘ erhöhen, um eine Zerodivisionerror:Fehler mit sympy.lambdify für stückweise Funktionen und numpy Modul
import sympy
x, y = sympy.symbols(['x', 'y'])
expr = sympy.Piecewise((1/x, y < -1), (x, y <= 1), (1/x, True))
f_sympy = sympy.lambdify([x, y], expr, modules='sympy')
f_numpy = sympy.lambdify([x, y], expr, modules='numpy')
print f_sympy(0, 1) # performs well
print f_numpy(0, 1) # issue: ZeroDivisionError
scheint, wie die stückweise definierten Funktionen, bevor die Bedingung auswerten mit Modulen = ‚numpy‘.
Meine Fragen sind:
Ist dieses Verhalten normal?
Wenn ja, warum, und wie man einen stückweisen Ausdruck definiert und so schnell wie mit numpy Modul ohne die sympy.lambdify Prozedur auswertet?
EDIT:
gefunden, dass die Lösung in meinem Fall ist Theanos:
import sympy
x, y = sympy.symbols(['x', 'y'])
f = sympy.Piecewise((1/x, y < -1), (x, y <= 1), (1/x, True))
from sympy.printing.theanocode import theano_function
f_theano = theano_function([x, y], [f])
print f_theano(0, 1) # OK, return 0
Vielen Dank. Das ist jetzt viel klarer für mich. Ich werde die 'numpy.array' Lösung versuchen. Für jetzt verwende ich diese Workaround, die ich erstellt, die "Lambdarepr" und (leider) "eval" ruft: https://gist.github.com/A-Falaize/ff2fafd5ab19f88c478f7494e340a619 Dies funktioniert für mich, ist aber nicht sehr ' Python '. Was sind die Nachteile einer solchen Lösung? – Toht
Ich sehe nicht, wie das Lambdify des armen Mannes dieses Problem löst. Von dem, was ich sagen kann, tut alles, was deine Funktion macht, 'sympy.lambdify' auch, aber' sympy.lambdify' macht auch viel mehr, also würde ich empfehlen, es einfach zu benutzen. – asmeurer