sympy: Das Objekt 'Transpose' hat kein Attribut tolist

8

Ich versuche einige symbolische Matrixberechnungen mit sympy zu machen. Mein Ziel ist es, eine symbolische Darstellung des Ergebnisses einiger Matrixberechnungen zu erhalten. Ich bin auf einige Probleme gestoßen, die ich auf dieses einfache Beispiel reduziert habe, in dem ich versuche, das Ergebnis einer Potenzierung einer bestimmten Matrix und deren Multiplikation mit einem beliebigen Vektor zu bewerten.

%Vor%

Wenn ich dagegen die Identitätsmatrix direkt anlege und sie dann mit v multipliziere, gibt es kein Problem:

%Vor%

Eine Sache, die ich bemerkt habe, ist, dass die zwei Identitätsmatrizen verschiedene Klassen haben:

%Vor%

Ich habe auch festgestellt, dass das Aufrufen der as_mutable() -Methode einen Workaround darstellt.

%Vor%

Ist es immer notwendig, as_mutable() -Aufrufe während der Berechnungen der linearen Algebra zu setzen? Ich vermute nicht, und stattdessen deuten diese Fehler darauf hin, dass ich die falsche Strategie verwende, um mein Problem zu lösen, aber ich kann nicht herausfinden, was die richtige Strategie wäre. Hat jemand irgendwelche Zeiger?

Ich habe die Dokumentationsseite zu unveränderlichen Matrizen gelesen, aber ich könnte trotzdem etwas Hilfe beim Verständnis gebrauchen wie wichtig ihre Unterschiede zu standardmä- ßigen Matrizen sind und warum einige Operationen (zB sympy.exp) zwischen diesen verschiedenen Klassen konvertieren.

    
Patrick Kaifosh 23.08.2015, 21:03
quelle

1 Antwort

4

Ich würde behaupten, dass dies ein Fehler in Sympy ist:

In Python können Sie den Multiplikationsoperator von beiden Seiten überladen . A*B kann intern behandelt werden, indem entweder A.__mul__(B) oder B.__rmul__(A) aufgerufen wird. Python ruft zuerst A.__mul__ auf, und wenn diese Methode nicht existiert oder NotImplemented zurückgibt, versucht Python B.__rmul__ automatisch. SymPy verwendet stattdessen einen Decorator namens call_highest_priority , um zu entscheiden, welche der beiden Implementierungen verwendet werden soll. Es sucht die _op_priority der beteiligten Klassen und ruft die Funktion der Implementierung mit höherer Priorität auf. Die Prioritäten in Ihrem Fall sind 11 für v und I und 10.01 für I_ , daher wird I bevorzugt. Außerdem fehlt der Basisimplementierung von __mul__ , die I verwendet, der Decorator.

Lange Rede, kurzer Sinn: I*v endet immer mit I.__mul__ , und __mul__ kann nicht mit MatrixSymbol s umgehen, gibt aber auch NotImplemented nicht zurück. v.__rmul__(I) funktioniert wie erwartet.

Die richtige Lösung wäre, die AttributeError in matrices.py zu erfassen und NotImplemented zurückzugeben, d. h.

%Vor%

Python würde dann automatisch auf __rmul__ zurückfallen. Der Hack'ish Fix wäre, _op_priority anzupassen. In jedem Fall sollten Sie einen Fehlerbericht einreichen: Wenn der Fehler von Entwurf war (das heißt, wenn Sie versehentlich etwas versucht haben, das nicht funktionieren sollte), dann würde die Fehlermeldung das sagen.

    
Phillip 03.05.2016, 06:09
quelle

Tags und Links