Seite 1 von 1

Diagonale in 2D-Liste

Verfasst: Dienstag 5. Juni 2007, 20:11
von Nachtschatten
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

Verfasst: Dienstag 5. Juni 2007, 20:28
von schlangenbeschwörer

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)

Verfasst: Mittwoch 6. Juni 2007, 12:47
von HWK
@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

Verfasst: Mittwoch 6. Juni 2007, 13:35
von 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]])

Verfasst: Mittwoch 6. Juni 2007, 13:51
von Michael Schneider
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

Verfasst: Mittwoch 6. Juni 2007, 14:17
von HWK
@Michael Schneider:
map ist eine eingebaute Funktion und sollte deshalb nicht als Dictionary-Name verwendet werden.
MfG
HWK

Verfasst: Mittwoch 6. Juni 2007, 14:35
von 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]]

Verfasst: Mittwoch 6. Juni 2007, 15:38
von Michael Schneider
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

Verfasst: Donnerstag 7. Juni 2007, 23:14
von Nachtschatten
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.