2016-04-07 9 views
0

Ich brauche Eigenwert-Eigenvektor Paaren zu sortieren, im Auftrag von Eigenwert Größen absteigend, und ich manchmal (~ 03.01 der Zeit) die folgende Fehlermeldung erhalten, wenn die .Sort() Funktion aufrufen:Python: Wenn Sie list.sort() aufrufen, erhalten Sie ValueError über Mehrdeutigkeiten?

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Das Bit Code, der den Fehler generiert, auf dem eigenPairs.sort() -Aufruf:

eigenPairs = [] # list of tuples of (eigenVal, eigenVect) 
for i in range(len(eigenVals)): 
    eigenPairs.append((eigenVals[i], eigenVects[:, i])) 

eigenPairs.sort() 
eigenPairs.reverse() 

die eigenvals und eigenVects Variablen im Allgemeinen die Ergebnisse einer SVD auf einer Matrix implementiert in einem benutzerdefinierten Verfahren sind - die Mathematik dahinter Teil überprüft. Der komische Teil ist, dass wenn der Code funktioniert, es funktioniert - ich bekomme die erwarteten Ergebnisse.

+0

Ergibt 'eigenVects [:, i]' keinen Fehler? Z.B. 'TypeError: Listenindizes müssen Ganzzahlen sein, nicht Tupel'? Wenn Sie die Werte von 0 bis i haben wollen, verwenden Sie 'eigenVects [: i]' – jDo

+0

das 'für i im Bereich (len (eigenVals)):' sieht sehr unpythonisch aus. Werfen Sie einen Blick auf enumerate https://docs.python.org/2/library/functions.html#enumerate –

+0

Können Sie angeben, wie "EigenVals" und "EigenVects" aussehen, wenn es fehlschlägt? –

Antwort

0

Es gibt viele Fragen zu diesem ValueError. Es ist das Ergebnis, das numpy boolesches Array in einem Python-Kontext verwendet, der einen skalaren booleschen Wert erwartet. Am häufigsten ist es eine if x:.. Aussage. Hier vermute ich, dass dies das Ergebnis einer Listensortierung in einer Liste ist, die Arrays enthält.

Entweder ändern Sie es in eine Liste von Listen oder Tupel, definieren Sie eine funktionierende Vergleichsfunktion oder Schlüssel, oder wechseln Sie zu Array-Sortierung.

Zum Beispiel versuchen Sie, nur das erste Element des Tupels zu sortieren, das ein Skalar ist.

Wie groß ist das 2. Element, die Eigenvektoren? Gibt es einen Unterschied zwischen den Fällen, in denen v ausgeführt wird, wenn es fehlschlägt?

Ich wette, Sie können die Eigenwerte in einem Array akkumulieren und sortieren. Oder argsort es.


sorted(L, key=operator.itemgetter(0)) 

wird die Art auf das erste Element der Tupel beschränken

https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions

https://wiki.python.org/moin/HowTo/Sorting/#Operator_Module_Functions

ich mit Tupeln experimentiert, dass keiner in der zweiten Schlitz enthalten. Sort ignorierte das, wenn die Reihenfolge des 1. Terms klar war, erzeugte aber Fehler, wenn es den 2. Term verwendet hatte, um Bindungen zu lösen.

Ich vermute, Ihre Art war in Ordnung, wenn Eigenwerte eindeutig waren, aber fehlgeschlagen, wenn es Dubletten gab und es versuchte, die Arrays zu bestellen.

+0

die Eigenvektoren sind alle Länge-1800, und ich dachte, Python sortierte Listen nach dem ersten Element der Tupel standardmäßig? – user2605299

+0

Ich fand eine SO Antwort auf die Sortierung von Listen von Listen, die 'itemgetter' verwendet. – hpaulj

Verwandte Themen