2016-10-22 48 views
0

我試圖做一個Python程序與numpy的,但我遇到了一個問題:的Python NumPy的創建拷貝,而不是引用

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 

這是我的代碼,在一個PNG,圖片閱讀。現在,我想編輯imageEdited_3d但不是imageOriginal_3d,像這樣:

imageEdited_3d[x,y,0] = 255 

但隨後imareOriginal_3d變量具有相同的值imageEdited_3d一個...

有誰知道,我怎麼能解決這個問題?所以它不僅創建了一個參考,而且它創建了一個真正的副本? :/

+1

您是在:'imageEdited_3d = imageOriginal_3d.copy()'? – MaxU

+0

@MaxU完美,工作。 Sry回答這個問題:D – Gykonik

+1

我保證比'np.vstack(list(map(np.uint8,pngData)))' – Eric

回答

6

您需要創建該對象的副本。您可以使用numpy.copy(),因爲您有numpy對象。因此,你的初始化應該是這樣的:

imageEdited_3d = imageOriginal_3d.copy() 

也有copy模塊用於創建深拷貝 OR,淺拷貝。這個工作獨立於對象類型。例如,使用copy代碼應爲:

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) 

描述:

淺拷貝構造新化合物對象,然後(到 儘可能)插入引用到它發現原來的 中發現的物體。

A 深度複製構造一個新的複合對象,然後遞歸地, 將副本插入原始對象中找到的對象。

+0

完美,我明白了。謝謝:D – Gykonik

+0

構建深層副本與淺層副本時,在時間消耗方面是否存在顯着差異? – wedran

+0

@wedran的確有。深度複製耗時更多!試試[這個要點](https://gist.github.com/we-taper/6a3e933fe2ff434c7bc313f51a07f1a4) – taper

相關問題