Bestimmte Werte in Array ersetzen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Sascha47
User
Beiträge: 3
Registriert: Freitag 4. Februar 2022, 16:59

Hallo Python-Forum,

ich bin Anfänger und lerne gerade Zielgetrieben Python. Ich bin im zweiten Tag und schreibe Schleifen, arbeite mit Arrays und bin darüber (viel Kaffee + Foren lesen) auf numpy gekommen. Jetzt meine Frage und ich habe wohl Tomaten auf den Augen:

Ich möchte gezielt Werte in einem numpy-Array mittels Schleifen ändern. Allerdings wird statt einem einzelnen Wert das ganze Array mit diesem Wert gefüllt:

1 for i in range(0,nrates-1):
2 K0_arg = K0
3 EA_arg = EA
4 k_arg = 26 + i #k_arg ist jetzt 26; i=0 im ersten Durchlauf
5 k = k_arg

vorher:
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0.]])

nachher (nach durchlaufen der ersten Schleife):
array([[26., 26., 26., 26., 26., 26., 26., 26., 26., 26., 26., 26., 26.,
26., 26., 26., 26., 26., 26., 26.]])

Beim zweiten Schleifendurchlauf bricht der Debugger ab.. Die Werte aus dem Array in Zeile 2 und 3 kann ich ohne weiteres auslesen. Nur das Zurückschreiben klappt nicht. Ich hoffe ihr könnt mir helfen. In jedem Fall schon mal vielen Dank im Voraus. (Im Forum hatte ich geschaut, bei der Vielzahl aber nicht mehr so eine ähnliche Frage auf die schnelle gefunden. Ich bin auch hier neu.)
Benutzeravatar
__blackjack__
User
Beiträge: 13189
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sascha47: Das ist nicht der Code den Du tatsächlich laufen lässt, denn dann wäre das Array nicht mit dem gleichen Wert gefüllt. Allerdings möchtest Du ziemlich sicher auch nicht ein Array mit einer Python-Schleife füllen, denn dann stellt sich die Frage warum Du da überhaupt ein Array verwendest und keine Liste. Numpy benutzt man ja hauptsächlich weil man das gerade nicht mit Python-Schleifen machen will, sondern die internen Operationen die in C/C++/Fortran geschrieben sind, nutzen möchte.

Edit: Sehe gerade, dass das kein eindimensionales Array ist, dann stimmt der Wert nach dem ersten Schleifendurchlauf doch. Und der Debugger bricht beim zweiten Durchlauf ab ist eine etwas unvollständige Beschreibung des offensichtlichen Indexerror, weil das Array zwar zweidimensional ist, aber die erste Dimension nur die Länge 1 hat. Ist also alles soweit erwartbar.

Code: Alles auswählen

In [34]: values = np.zeros((1, 10))                                             

In [35]: values                                                                 
Out[35]: array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

In [36]: values[0] = 42                                                         

In [37]: values                                                                 
Out[37]: array([[42., 42., 42., 42., 42., 42., 42., 42., 42., 42.]])

In [38]: values[1] = 23                                                         
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-38-6c57e0c1bb5f> in <module>
----> 1 values[1] = 23

IndexError: index 1 is out of bounds for axis 0 with size 1
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

@Sascha47: Und es stellt sich die Frage welches "Ziel" Zielgetriebenes (sic) Lernen hat. Also ob das Abbiegen zu numpy wirklich nötig ist oder ob du nur versehentlich über dessen Arrays gestolpert bist und eigentlich Listen verwenden möchtest.
Sascha47
User
Beiträge: 3
Registriert: Freitag 4. Februar 2022, 16:59

Hallo zusammen,

danke schonmal für eure Antworten. Das Ziel ist es eigentlich, am Ende ein Mehrdimensionales Array ähnlich einer Excel-Liste zu nutzen. Dazwischen gibt es mehrere prozessierungsschritte —> einzelne Werte des Array sollen nach und nach modifiziert werden. —> Ihr habt recht, das mehrdimensionale Array könnte ich durch Listen ersetzen. Ich überdenke deshalb nochmal mein Programmkonzept (Ich hatte vorher viel mit VBA programmiert, deshalb bin ich konzeptionell vielleicht noch zu nah an Listen..).

@__Blackjack__: Ich verstehe die Abbildung nicht ganz: In Zeile 36 vs. 38, was genau spreche ich mit der Zahl Null in values[0] bzw. values[1] für eine Dimension an, es ändert sich doch jeweils die gesamte Liste durch das Argument. Edit:<— hat sich erledigt, ich habe die Abbildung verstanden. Danke!
Ich habe bemerkt, wenn ich das Array mit Zufallszahlen fülle, kann ich mit dem Befehl „values[0] = 23“ zum Beispiel direkt die erste Zahl des Array durch die 23 ersetzen. Insgesamt scheint das Zahlenformat und die Werte im Array hier eine Rolle zu spielen, das ist mir noch nicht ganz klar. Hättet ihr einen Link o.ä. wo ich es nachlesen oder nachvollziehen kann? Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt, ich bringe mir Python nur über Tutorials bei. Nochmals Danke für eure Rückmeldungen, VG

Edit: Kann ich das Zahlenformat in den Arrays gleich auf die Wissenschaftliche Schreibweise stellen?
Benutzeravatar
sparrow
User
Beiträge: 4230
Registriert: Freitag 17. April 2009, 10:28

Da du von "Tabellen" sprichst, bin ich mir ziemlich sicher, dass du dir eigentlich Pandas anschauen möchtest.
Sascha47
User
Beiträge: 3
Registriert: Freitag 4. Februar 2022, 16:59

Hy @sparrow: Pandas? Noch nicht gehört, ich lese mich mal in die Richtung ein. 1000dank für den Impuls in die Richtung
edit: Das sieht wirklich besser aus (zumindest für meinen Fall) und jetzt verstehe ich, weshalb bei Tabellenkalkulationen eher von numpy abgeraten wird. Freue mich schon Pandas zu testen :D
Python ist wirklich eine schöne Programmiersprache. Ich fuchs mich ja erst rein, aber so schnell war ich noch nie so gehooked. Danke euch für euren Input!
Antworten