Matirzen vergleichen (auf Symmetrie)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sponk
User
Beiträge: 10
Registriert: Montag 12. November 2007, 13:28

Hi!

Kann ich eine Untersuchung einer Matrix auf Symmetrie (A = A^T) auch ohne Schleife lösen?

Ich hätte mir da etwas in dieser Richtung vorgestellt:

Code: Alles auswählen

if A.transpose() == A:
	print 'A ist symmetrisch!'
else:
	print 'A ist nicht symmetrisch!'
Kriege dann folgende Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Danke!
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

Ja das geht, aber nicht mir Arrays, sondern mit selbstgebauten Objekten. Ein Sequenzobjekt (Liste, Tupel, ...) ist immer wahr, wenn es nicht leer ist. Für eine eigene Objektklasse kannst du Methoden wie das Transponieren und Vergleiche mit == udlg implementieren.
(Zum Vergleichsoperator siehe das Kapitel "special method names" in der Language Reference.)

(Warum der Wahrheitswert eines Arrays ambiguitiv ist? Keine Ahnung, ich dachte, der sei eindeutig wahr oder eindeutig falsch.)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

ich nehme an Du sprichst von numpy.array-Instanzen?

Code: Alles auswählen

In [4]: a = matrix([[1,0,0],[0,1,0],[0,0,1]])
...
In [7]: a == a.T
Out[7]: 
matrix([[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]], dtype=bool)
In [8]: b = matrix([[1,1,0],[0,1,0],[0,0,1]])
...
In [11]: b == b.T
Out[11]: 
matrix([[ True, False,  True],
        [False,  True,  True],
        [ True,  True,  True]], dtype=bool)
...
In [13]: all(b==b.T)
Out[13]: False

In [14]: all(a==a.T)
Out[14]: True
Hilft das weiter?

Gruß,
Christian
sponk
User
Beiträge: 10
Registriert: Montag 12. November 2007, 13:28

Vielen Dank!
Den Gedanken hatte ich auch gerade...

Code: Alles auswählen

if all(A.transpose() == A):
    print 'A ist symmetrisch!'
else:
    print 'A ist nicht symmetrisch!' 
Das scheint nun zu funktionieren :)

Gruß, Eddi
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

windner hat geschrieben:(Warum der Wahrheitswert eines Arrays ambiguitiv ist? Keine Ahnung, ich dachte, der sei eindeutig wahr oder eindeutig falsch.)
Das ist eine clevere Fehlermeldung von numpy: Ansonsten ist nämlich nicht klar was genau im Vergleich abgefragt wird. any() ist eben etwas anderes als all(). Die Entwickler könnten zwar einen default einbauen, aber der währe eben oft nicht sinnvoll. Also wird vorgegeben auf eine von zwei eindeutigen Funktionen auszuweichen.

Gruß,
Christian
Antworten