Seite 1 von 1

Matirzen vergleichen (auf Symmetrie)

Verfasst: Dienstag 11. Dezember 2007, 15:59
von sponk
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!

Verfasst: Dienstag 11. Dezember 2007, 16:13
von windner
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.)

Verfasst: Dienstag 11. Dezember 2007, 16:32
von CM
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

Verfasst: Dienstag 11. Dezember 2007, 16:37
von sponk
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

Verfasst: Dienstag 11. Dezember 2007, 16:43
von CM
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