2016-10-22 5 views
0

Ich versuche, ein Python-Programm mit numpy zu machen, aber ich lief in ein Problem:Python numpy Kopie erstellen und verweist nicht

width, height, pngData, metaData = png.Reader(file).asDirect() 
planeCount = metaData['planes'] 
print('Bildgroesse: ' + str(width) + 'x' + str(height) + ' Pixel') 
image_2d = np.vstack(list(map(np.uint8, pngData))) 
imageOriginal_3d = np.reshape(image_2d, (width, height, planeCount)) 
imageEdited_3d = imageOriginal_3d 

Dies ist mein Code, in einem png-Bild zu lesen. Jetzt möchte ich imageEdited_3d bearbeiten, aber NICHT imageOriginal_3d, wie folgt aus:

imageEdited_3d[x,y,0] = 255 

Aber dann die imareOriginal_3d Variable, die die gleichen Werte wie die imageEdited_3d hat ein ...

Wer weiß, wie kann ich dieses Problem beheben? Es wird also nicht nur eine Referenz erstellt, sondern eine echte Kopie erstellt. :/

+1

Sind Sie auf der Suche nach: 'imageEdited_3d = imageOriginal_3d.copy()'? – MaxU

+0

@MaxU perfekt, gearbeitet. Sry für die Frage: D – Gykonik

+1

Ich garantiere, es gibt eine viel schnellere Möglichkeit, das Bild zu lesen als 'np.vstack (Liste (Karte (np.uint8, pngData))) – Eric

Antwort

6

Sie müssen die Kopie des Objekts erstellen. Sie können es mit numpy.copy() tun, da Sie numpy Objekt haben. Daher sollten Sie Ihre Initialisierung wie:

imageEdited_3d = imageOriginal_3d.copy() 

Auch gibt es copy Modul für die Erstellung der tiefe Kopie OR, flache Kopie. Dies funktioniert unabhängig vom Objekttyp. Zum Beispiel Code copy verwenden soll wie:

from copy import copy, deepcopy 

# Creates shallow copy of object 
imageEdited_3d = copy(imageOriginal_3d) 

# Creates deep copy of object 
imageEdited_3d = deepcopy(imageOriginal_3d) 

Beschreibung:

A flache Kopie erstellt ein neues zusammengesetztes Objekt und dann (zur soweit möglich) fügt Referenzen in es zu den Objekten gefunden in das Original.

A tiefe Kopie eine neue Verbindung Objekt konstruiert und dann rekursiv Einsätze Kopien in sie der Objekte im Original gefunden.

+0

Perfekt, ich habe es. Danke: D – Gykonik

+0

Gibt es einen bemerkenswerten Unterschied beim Zeitaufwand beim Erstellen einer tiefen Kopie im Gegensatz zu einer flachen Kopie? – wedran

+0

@wedran Es gibt tatsächlich. Deepcopy ist viel zeitaufwendiger! Versuchen Sie [diese Giste] (https://gist.github.com/we-taper/6a3e933fe2ff434c7bc313f51a07f1a4) – taper

Verwandte Themen