Diagonale in 2D-Liste

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
Nachtschatten
User
Beiträge: 2
Registriert: Dienstag 5. Juni 2007, 19:44

Hallo erstmal!

Ich soll für Mathe ein Script schreiben. Es geht um Matrizen. Ich möchte eine quadratische Matrix erstellen, bei der alle Elemente 0 sind, bis auf die Diagonalelemente, die sollen 1 sein. Beispiel:
1 0 0
0 1 0
0 0 1

Ich wollte das so lösen, dass ich erst mal eine zweidimensionale Liste erstelle, alle Elemente auf 0 setze, und dann mit einer for-Schleife die diagonalen Elemente ändere. Mein Code dazu sieht so aus:

Code: Alles auswählen

def createHugeMatrix( n):
  hugeMatrix = n * [n * [0]]
  for i in range( n):
    hugeMatrix[ i][ i] = 1
  return hugeMatrix
Das scheint aber nicht zu funktionieren. Die Matrix hat vor der for-Schleife zwar die richtige Größe und alle Elemente sind 0. Aber: Statt dass nur hugeMatrix[0][0], [1][1], ... (die Diagonalelemente) auf 1 gesetzt werden, sind nach der for-Schleife plötzlich alle Elemente = 1.
Ich steh grad total auf der Leitung. :? Warum ist das so? Und wie mache ich das richtig? Ich hoffe, mir kann jemand helfen. :)

LG
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Code: Alles auswählen

x=[]
for i1 in xrange(4):
	d2=[]
	for i2 in xrange(4):
		if i1 == i2:
			item = 1
		else:
			item = 0
		d2.append(item)
	x.append(d2)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@Nachtschatten: Deine Matrix enthält n identische Verweise auf das Objekt [n * [0]]. Wenn Du also eine Zeile der Matrix änderst, änderst Du die anderen gleichzeitig mit.
MfG
HWK
BlackJack

Wenn der Sinn der Übung nicht gerade ist zu zeigen, dass man Matrizenoperationen selber implementieren kann, ist vieleicht auch `numpy` eine Alternative:

Code: Alles auswählen

In [43]: numpy.identity(5, int)
Out[43]:
array([[1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]])
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi,

ok, es geht auch mit arrays (auch mit dem std-modul array). Listen kannst Du am elegantesten mit List-Comprehensions erzeugen, finde ich:
>>> [[a==b for a in xrange(n)] for b in xrange(n)]
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
Wenn Du eine Python Version >= 2.3 verwendest, liefert der Vergleich evtl. True statt 0, dann brauchst Du das Ergebnis nur zu mappen:
EDIT: "map" ersetzt durch "dMap", weil "map" eingebaute Funktion ist!
>>> dMap = {0==0: 1, 0!=0: 0}
>>> [[dMap[a==b] for a in xrange(n)] for b in xrange(n)]
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
Einfach und übersichtlich. :-)
Aber es gibt schon vordefinierte Module und Methoden für Matrizen, vor allem für solche Einheitsmatrizen.

Grüße,
Michael
Zuletzt geändert von Michael Schneider am Mittwoch 6. Juni 2007, 15:41, insgesamt 1-mal geändert.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@Michael Schneider:
map ist eine eingebaute Funktion und sollte deshalb nicht als Dictionary-Name verwendet werden.
MfG
HWK
BlackJack

Man könnte anstelle der Abbildung auch einfach die `int()`-Funktion verwenden:

Code: Alles auswählen

In [72]: [[int(a == b) for a in xrange(n)] for b in xrange(n)]
Out[72]:
[[1, 0, 0, 0, 0],
 [0, 1, 0, 0, 0],
 [0, 0, 1, 0, 0],
 [0, 0, 0, 1, 0],
 [0, 0, 0, 0, 1]]
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

HWK hat geschrieben:@Michael Schneider:
map ist eine eingebaute Funktion und sollte deshalb nicht als Dictionary-Name verwendet werden.
Oh, stimmt - das ist gar nicht gut. Das kommt davon, wenn man das ohne Syntax-Highlighting einfach mal so schnell hintippt. :-) Liegt wohl daran, dass es eher symbolisch gemeint war, denn als zu verwendenden Code. Trotzdem ein schlechtes Beispiel...

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Nachtschatten
User
Beiträge: 2
Registriert: Dienstag 5. Juni 2007, 19:44

Danke an alle, konnte meine Aufgaben mit eurer Hilfe lösen. :)
HWK hat geschrieben:@Nachtschatten: Deine Matrix enthält n identische Verweise auf das Objekt [n * [0]]. Wenn Du also eine Zeile der Matrix änderst, änderst Du die anderen gleichzeitig mit.
MfG
HWK
Aah achso! Genau die Erleuchtung hatte ich gebraucht. ;)
BlackJack hat geschrieben:Wenn der Sinn der Übung nicht gerade ist zu zeigen, dass man Matrizenoperationen selber implementieren kann
Nein ;) Es ist schon eine etwas komplexere Aufgabe. Die Matrix sieht eigentlich auch noch etwas anders aus, aber als ersten Schritt wollte ich nur so eine Matrix erstellen, und bin da schon gestolpert.
Die Aufgabenstellung sagt aber ehrlich gesagt nicht viel aus. Man darf "eine Programmiersprache seiner Wahl" benutzen. Aber bevor meine Aufgabe nicht gewertet wird weil ich irgendwelche Bibliotheken benutze, gehe ich lieber auf Nummer sicher und schreib so viel wie es geht selbst.
Antworten