Seite 1 von 2
					
				Zweidimensionale innere Liste durchlaufen
				Verfasst: Sonntag 28. September 2025, 19:54
				von NWA
				Hi,
ich möchte gerne eine Liste effizient meinem Diagramm übergeben; habe aber Verständnisprobleme mit zweidimensionalen Listen. Eigentlich geht es darum matplotlib.pyplot.step(Liste x, Liste y) aus einer vorhandene zweidimensionalen Liste immer das x.Element zum Zeichnen zu übergeben- ohne eine neue Liste erstellen zu müssen. Getestet habe ich es damit:
Code: Alles auswählen
a = [[1,2],[3,4],[5,6],[7,8]]
print(a[0:2][1])
>> [3, 4]
print() gibt aber nur das zweite Element zurück. Numpy soll das wohl können, aber leider kann in einem array nur ein Datentyp verwendet werden. Bei mir sind aber 
int und 
float gemischt.
 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Sonntag 28. September 2025, 20:06
				von Sirius3
				
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Sonntag 28. September 2025, 20:07
				von NWA
				@Sirius3
Wo ist denn hier der Dankeknopf....
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Montag 29. September 2025, 05:29
				von NWA
				Ich glaube numpy ist ungeeignet, weil arrays unveränderlich sind. Er würde bei jeder Änderung des Feldes ein neues Feld erstellen. Was ich ja gerade vermeiden möchte...
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Montag 29. September 2025, 06:05
				von snafu
				@NWA: So bekommt man jedes zweite Element der inneren Listen:
Code: Alles auswählen
>>> data = np.array([[1,2],[3,4],[5,6],[7,8]])
>>> data
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])
>>> data[:,1]
array([2, 4, 6, 8])
Das ist doch, was du wolltest, oder?
Dabei erzeugt Numpy kein neues Array, sondern einen View auf die gefilterten Elemente. Das heißt, sie werden referenziert, aber nicht tatsächlich in eine neue Datenstruktur kopiert. Das kannst du 
hier in der Note-Box auch gerne nachlesen.
 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Montag 29. September 2025, 06:37
				von NWA
				Ja, diesen view benötige ich tatsächlich. Aber ich muss das Feld ständig verändern. Angeblich wird ein numpy-Feld neu kopiert, wenn etwas hinzugefügt oder entfernt wird. Dazu habe ich folgendes gefunden:
Hiervon ist allerdings abzuraten, da bei jeder Ausführung von append eine Kopie des NumPy-Arrays erstellt wird. (https://gertingold.github.io/pythonnawi/numpy.html)
 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Montag 29. September 2025, 07:25
				von snafu
				Aber brauchst du denn append? Was genau möchtest du denn verändern?
Es ist z. B. möglich, alle Elemente des Views auf einen Schlag zu ändern, was sich dann immer auch auf die Original-Struktur auswirkt:
Code: Alles auswählen
>>> data[:,1] = 0
>>> data
array([[1, 0],
       [3, 0],
       [5, 0],
       [7, 0]])
Aber auch andere Modifikationen sind möglich. Probiere es einfach mal in der Python-Shell aus. 

 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Montag 29. September 2025, 07:55
				von Sirius3
				@NWA: was ist Dein Problem? Beschreibe vollständig und verständlich.
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Montag 29. September 2025, 21:49
				von NWA
				Das Problem ist schon gelöst. numpy kopiert bei Veränderungen das array. Das kommt aus Performanz-Gründen nicht in Frage. Ich werde deshalb Listen verwenden.
Append brauche ich, weil ich eine Ringliste habe, welche immer in der Größe angepasst werden muss. Wenn numpy ständig das Feld kopiert, dann wäre der Rechner nur damit beschäftigt.
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Montag 29. September 2025, 22:30
				von __blackjack__
				@NWA: Das hast Du *ausprobiert*, oder gehst Du einfach davon aus?  Du hast keine ”Ringliste” wenn Du nur `append()` verwendest.  Wenn Du aber aus der Liste am Anfang Elemente raus löschen solltest: rate was dann passiert.  Tipp: hat was mit kopieren zu tun.
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Montag 29. September 2025, 22:43
				von Sirius3
				@NWA: wie sieht Dein Code aus? Wie hast Du die Performanz gemessen? Wie groß ist Deine Ringliste?
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Dienstag 30. September 2025, 03:40
				von Pedroski55
				Was ist schlimm an einem direkten Zugriff auf a?
>> [3, 4]
 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Dienstag 30. September 2025, 05:46
				von NWA
				Für den Börsenhandel habe ich eine bereits funktionierende Ringliste erstellt. Es kommen unzyklisch bis zu 100 Werte in der Sekunde. Ein Zeiger zeigt immer auf den aktuell zu schreibenden Index. Die Liste soll immer eine minimale und maximale Grösse einhalten. Die Grösse wird zur Laufzeit ermittelt und kann bis 100 000 Elemente beinhalten. Gelöscht oder hinzugefügt werden Elemente nur, wenn der Zeiger auf das letzte Element zeigt. Für jeden ankommenden Kurs wird in die äussere Liste eine innere Liste geschrieben, welche Zeit, Kurs und weitere Parameter beinhaltet.
Ich möchte aus dieser Ringliste eine Teilliste bestimmter Elemente der inneren Liste meinem matplotlib-Diagramm direkt übergeben. Der beste Ansatz wäre slicing gewesen. Listen unterstützen aber kein slicing der äusseren Liste.
Numpy unterstützt aber slicing der äusseren Liste. Leider ist es trotzdem ungeeignet, da bei jeder Änderung das Feld kopiert wird.
Die Performanz habe ich noch nicht gemessen. Dennoch ist das ständige Kopieren ein Ausschlusskriterium um numpy zu verwenden. Als Lösung wollte ich für das Diagramm eine zweite eindimensionale Liste erstellen, welche dann an das Diagramm übergeben wird.
 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Dienstag 30. September 2025, 07:41
				von Pedroski55
				Listen unterstützen aber kein slicing der äusseren Liste.
Wirklich?
Code: Alles auswählen
a = [[1,2],[3,4],[5,6],[7,8]]
b = a[0:2]
b
[[1, 2], [3, 4]]
 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Dienstag 30. September 2025, 07:51
				von NWA
				Das ist die äussere Liste.
Jetzt versuch mal aus den inneren Listen immer das nullte Element auszugeben:
 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Dienstag 30. September 2025, 08:40
				von Kebap
				NWA hat geschrieben: Dienstag 30. September 2025, 07:51
Jetzt versuch mal aus den inneren Listen immer das nullte Element auszugeben
 
Okay  
 
 
Code: Alles auswählen
a = [[1,2],[3,4],[5,6],[7,8]]
b = [c[0] for c in a[0:2]]
print(b)
# [1, 3]
 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Dienstag 30. September 2025, 08:59
				von NWA
				Das geht auch. Aber dann durchlaufe ich wieder und jedesmal die ganze Liste.
Ich frage mich aber, ob beim slicing wieder eine Teilliste erstellt wird. Aber selbst wenn das äussere slicing funktionieren sollte, wird die Ringliste jedesmal komplett durchlaufen.
Ich denke das Beste ist, wenn ich für die Übergabe zum Diagramm zwei neue Ringlisten anlege, welche bei jedem Durchlauf ein Element hinzufügt und das Ende dynamisch kappt.
Vielen Dank für eure Hinweise.
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Dienstag 30. September 2025, 09:33
				von __blackjack__
				Ich denke das Beste ist es erst einmal korrekt zu lösen, und dann zu messen wo zu viel Zeit verbraucht wird.  Oder ob da überhaupt zu viel Zeit verbraucht wird.
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Dienstag 30. September 2025, 11:49
				von Sirius3
				@NWA: so wie Du Deine "Ringliste" beschreibst, wird immer nur das älteste Element überschrieben. Das geht natürlich auch mit numpy-Arrays ohne Kopie. Man muß halt nur das initiale Array groß genug anlegen.
Bei Listen wird auch, je nach Bedarf kopiert.
			 
			
					
				Re: Zweidimensionale innere Liste durchlaufen
				Verfasst: Dienstag 30. September 2025, 12:02
				von snafu
				NWA hat geschrieben: Dienstag 30. September 2025, 08:59
Aber selbst wenn das äussere slicing funktionieren sollte, wird die Ringliste jedesmal komplett durchlaufen.
 
Weiter oben war deine Anforderung, dass aus jeder Unterliste das zweite Element genommen werden soll. Dafür muss selbstverständlich die komplette Liste durchlaufen werden. Aber das stört dich nun auch? Es kommt mir ein bisschen vor, als weißt du selber nicht genau, was du eigentlich willst. Umso schwieriger ist es dann, dir sinnvoll helfen zu können...