Kopieren von Matrixwerten

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
Libelle
User
Beiträge: 3
Registriert: Mittwoch 29. April 2015, 17:11

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.]]
Zuletzt geändert von Anonymous am Mittwoch 26. April 2017, 13:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

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
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten