numpy array mit falschem Assignment

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mettbär
User
Beiträge: 2
Registriert: Sonntag 18. Oktober 2015, 06:11

Hallo,

ganz am Ende des folgenden Scripts sollte doch eigentlich das test-Array ausgegeben werden, oder nicht? Anscheinend setzt Python bei mir test auf test2, gibt also das falsche Array aus und überschreibt das richtige. Dabei ist auch egal, ob ich die Reihenfolge vertausche, also test=test2 verwende. Liegt das an meinem Code oder ist das nur bei mir so? Ich verwende Python 3.5 (64-bit) und Windows 7, falls euch das hilft.

Code: Alles auswählen

import numpy

test=numpy.array([1,2,3,4,5])
test2=test
for i in range(1,5):
        test2[i]=test2[i-1]+test2[i]
test2=test
print(test2)
Über Hilfe wäre ich echt dankbar, weil ich die Konstruktion oben in komplizierterer Ausführung zum Testen eines Verfahrens brauche.

Alex
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum!

`test2` _ist_ `test`. Eine Zuweisung erstellt keine Kopie. Aber `numpy.array` kennt eine `copy` Methode:

Code: Alles auswählen

In [9]: import numpy

In [10]: a = numpy.array(range(1,6))

In [11]: a2  = a.copy()

In [12]: for i in range(1, 5):
    a2[i] = a2[i-1] + a2[i]
   ....:     

In [13]: print(a2)
[ 1  3  6 10 15]

In [14]: print(a)
[1 2 3 4 5]
mettbär
User
Beiträge: 2
Registriert: Sonntag 18. Oktober 2015, 06:11

Ah ja. Das ist mir zuvor nie aufgefallen. Mit copy funktioniert alles richtig. Danke für die schnelle Antwort.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@mettbär: für dieses Beispiel macht man auch keine Kopie, weil die passende numpy-Funktion schon automatisch das Ergebnis in einem neuen Array zurückliefert:

Code: Alles auswählen

>>> a = numpy.arange(1,6)
>>> a2 = a.cumsum()
>>> print(a2)
[ 1  3  6 10 15]
Bevor Du for-Schleifen verwendest, solltest Du nach passenden numpy-Schreibweisen suchen. Statt explizit Kopien zu machen, bekommst Du oft schon implizit ein neues Array.
Antworten