【问题标题】:Create a copy and not a reference of a NumPy array创建一个副本而不是 NumPy 数组的引用
【发布时间】:2016-10-22 20:58:32
【问题描述】:

我正在尝试使用 NumPy 制作 Python 程序,但遇到了问题:

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 具有相同的值...

有谁知道,我该如何解决这个问题?所以它不仅创建了一个引用,而且创建了一个真实的副本? :/

【问题讨论】:

    标签: python numpy copy


    【解决方案1】:

    您需要创建对象的副本。您可以使用numpy.copy() 来执行此操作,因为您拥有numpy 对象。因此,您的初始化应该是这样的:

    imageEdited_3d = imageOriginal_3d.copy()
    

    还有copy 模块用于创建深拷贝浅拷贝。这与对象类型无关。例如,您使用 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)
    

    说明:

    浅拷贝构造一个新的复合对象,然后(到 尽可能)将引用插入其中找到的对象 原件。

    深拷贝构造一个新的复合对象,然后递归地, 将原始对象中的对象的副本插入其中。

    【讨论】:

    • 构建深拷贝和浅拷贝的耗时是否有显着差异?
    • @wedran 确实有。 Deepcopy 更耗时!试试this gist
    猜你喜欢
    • 2015-07-23
    • 2020-07-14
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2012-11-25
    • 2021-04-12
    • 2016-07-30
    相关资源
    最近更新 更多