Seite 1 von 1

Kopieren von Matrixwerten

Verfasst: Mittwoch 26. April 2017, 11:12
von Libelle
Hallo zusammen,
Ich habe das Problem, das Python Vektoren/Matrizen überschreibt, deren ursprüngliche Werte im Programmverlauf noch benötigt werden.
Kenn jemand eine Lösung dafür?

Vielen Dank im Voraus

Beispiel:

Code:

Code: Alles auswählen

def Berechnung_von_a_neu(a):
b=a    
    
    for i in range(0,5,1):
        a_zw=b[i]
        a_neu_i=a_zw*25
        b[i]=a_neu_i
    a_neu=b
    return a_neu


a= np.ones((5,1))
print "a Ausgangswert",a
neu_berechnung_a=Berechnung_von_a_neu(a)
print"a nach Berechnung",a

print "a_neu", neu_berechnung_a
Ergebnis:
a Ausgangswert
[[ 1.] [ 1.] [ 1.] [ 1.] [ 1.]]
a nach Berechnung
[[ 25.] [ 25.] [ 25.] [ 25.] [ 25.]]

a_neu
[[ 25.] [ 25.] [ 25.] [ 25.] [ 25.]]

Re: Kopieren von Matrixwerten

Verfasst: Mittwoch 26. April 2017, 11:41
von TrayserCassa
Hey Ho!

Also Werte die du behalten möchtest wurde ich in eine Liste speichern.
Falls du Code postest benutzte bitte in Zukunft den codeblock :)

codebox=python file=Unbenannt.py (Die [] Klammern nicht vergessen)

np.ones((5, 1))
np wird in deinem Code nicht initialisiert. Da fehlt etwas vom Code :)

MfG
Trayser

Re: Kopieren von Matrixwerten

Verfasst: Mittwoch 26. April 2017, 12:22
von kbr
@Libelle: Da Numpy für die Bearbeitung großer Datenmengen ausgelegt ist, wird stets gegen die Datenstruktur gearbeitet. Wenn Du eine Kopie brauchst, musst Du diese explizit über array.copy() anlegen.

Re: Kopieren von Matrixwerten

Verfasst: Mittwoch 26. April 2017, 12:26
von Sirius3
Ein "b = a" macht nichts anderes, als das Objekt, das vorher unter dem Namen a bekannt war auch unter dem Namen b zu führen. Daher sind Deine Namesgebung irreführend, weil nichts kopiert wird.

Von daher wäre es besser, die Funktion so zu schreiben, da sie exakt das selbe tut, aber hier deutlich wird, dass a verändert wird:

Code: Alles auswählen

def Berechnung_von_a_neu(a):
    """ Achtung: die Matrix a wird verändert """
    for i in range(0,5,1):
        a[i] = a[i] * 25
Dadurch, dass ich der Funktion keinen Rückgabewert gegeben habe, wird nochmal deutlich, das was reingeht wird verändert.

Da Du numpy verwendest, ist die Lösung ganz einfach:

Code: Alles auswählen

def Berechnung_von_a_neu(a):
    return a * 25
Hier wird automatisch eine neue Matrix erzeugt. Versuche bei Rechnungen mit numpy so wenig auf einzelne Elemente zuzugreifen, wie geht, dann wird viel klarer, wann eine Kopie erzeugt wird, und wann man die selbe Matrix verändert. Nochmal zum Vergleich:

Code: Alles auswählen

b = a * 25 # neue Matrix b
a *= 25 # Werte von Matrix a werden verändert
@kbr: solche expliziten Kopien werden selten, weil numpy viele mächtige Operatoren hat.