leere Matrix erstellen und füllen

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
Benutzeravatar
Tomizz
User
Beiträge: 3
Registriert: Dienstag 24. April 2018, 18:05

Hi,

ich möchte eine leere Matrix erstellen und mit Werten aus einer csv-Datei füllen. Der Anfang zum Testen könnte so aussehen:

Code: Alles auswählen

matrix = [[0,0,0],[0,0,0],[0,0,0]]
matrix[0][1] = 23
Das klappt erstmal. Da die Dimension der Matrix aber vorher nicht feststeht und in Abhängigkeit von den einzulesenden Daten abhängt, könnte man die Matrix auch so erstellen:

Code: Alles auswählen

matrix = [[0]*3]*3
Bei der Zuweisung mit

Code: Alles auswählen

matrix[0][1] = 23
wird aber nicht nur ein einzelnes Element angesprochen, sondern gleich drei (immer jeweils das zweite). Warum, ist mir schon klar. Kann man die Matrix vielleicht irgendwie ändern, dass alle Elemente voneinander unabhängig sind? Oder lässt sich eine leere Matrix auch anders erstellen?

Danke
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tomizz: im zweiten Fall erzeugst Du nur eine innere Liste und wiederholst sie drei mal. Du mußt also mit einer for-Schleife so viele Listen erzeugen, wie Du brauchst. Aber normalerweise erzeugt man auch keine leeren Liste, um sie später zu füllen, sondern erzeugt sie gleich mit dem richtigen Inhalt.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du musst das ja nicht vordefinieren. Du kannst auch erst mittels des csv-Moduls die CSV-Datei einlesen und dann die verschachtelte Liste erzeugen.

BTW: je nach dem, was du mit den Werten noch vorhast bzw. je nach Anzahl der Werte greift man besser zu numpy und einem numpy-Array.

Gruß, noisefloor
Benutzeravatar
Tomizz
User
Beiträge: 3
Registriert: Dienstag 24. April 2018, 18:05

Vielen Dank für die Hinweise. Eine leere Matrix vorher zu erstellen ist sicherlich keine gute Idee. Ich dachte zunächst, dass es so funktionieren könnte. Nach längerem Tüfteln habe ich folgende Lösung gefunden:

Code: Alles auswählen

matrix = []
with open("Daten.dat", "r") as fobj:
	for line in fobj:
		matrix.append(line.strip().split(";"))
Dabei können die Zeilen auch unterschiedlich viele Elemente haben. Mir ging es um ziemlich kleine Dateien, die ausgelesen werden sollen und in denen ein paar Parameter gespeichert sind. Da ist die Verwendung von numpy vielleicht etwas übertrieben. Trotzdem Danke für den Tip.

Tomizz
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tomizz: besser lies die Datei mit dem csv-Modul. Eingerückt wird immer mit 4 Leerzeichen pro Ebene.

Code: Alles auswählen

with open("Daten.dat", "r") as lines:
    matrix = list(csv.reader(lines, delimiter=";"))
Benutzeravatar
Tomizz
User
Beiträge: 3
Registriert: Dienstag 24. April 2018, 18:05

Diese vorgeschlagene Lösung funktioniert auch, aber die erste Zeile in der csv-Datei wird dabei immer ignoriert. Erst ab der zweiten Zeile werden die Daten eingelesen. Kann das sein?

P.S.: Prinzipiell rücke ich immer mit 4 Leerzeichen ein. Wahrscheinlich ist bei copy&paste was schiefgelaufen.
Antworten