2016-07-23 13 views
1

Ich erkannte heute, dass sympys Matrixsymbole in einem Vektor (für mehrere partielle elementweise Ableitungen über eine Kovarianzmatrix) mit dem scipy's cdist während des optimize.minimize Prozesses inkompatibel waren, da es tatsächliche Verwendung annimmt der Zahlen beim Aufruf der Funktion (fair genug).scipy's cdist inkompatibel mit Sympy Symbolen

Es zuerst die Frage läuft in denen der Ausdruck nicht in einen float umgewandelt werden, da es durch eine sehr lange Liste von wiederholten sympy Symbolen

TypeError: can't convert expression to a float 

Gefolgt enthält:

During handling of the above exception, another exception occurred: 
SystemError: <built-in function hasattr> returned a result with an error set 

Gibt es einen eingebauten Weg, um sowohl CDist als auch Substitution mit Sympys Symbolen zu verwenden, oder ist hier die einzige Option, eine benutzerdefinierte Implementierung von CDist zu implementieren, die mit Symbolen umgehen kann? Nicht, dass es wichtig wäre, aber die CDist-Methode, die ich benutze, ist quadratisch euklidisch.

Danke.

Antwort

1

Wie Sie festgestellt haben, behandelt scipy.distance.cdist keine beliebigen Objekte. Sie müssen die euklidische Norm selbst implementieren.

1

Sie können die Norm eines SymPy-Matrixausdrucks ermitteln, indem Sie ihn zuerst in ein explizites Matrixobjekt konvertieren und dann die Normmethode verwenden.

In [13]: A = MatrixSymbol("A", 1, 3) 

In [14]: A.as_explicit().norm() 
Out[14]: 
    __________________________ 
    ╱  2  2  2 
╲╱ │A₀₀│ + │A₀₁│ + │A₀₂│