创建NumPy数组的副本而不是引用

ntjbwcob  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(159)

我目前正在开发一个Python程序,涉及使用NumPy进行图像处理。然而,我在尝试创建NumPy数组的深度副本而不仅仅是复制引用时遇到了一个问题。
下面是我的代码片段,我读入一个PNG图像并将其分配给imageOriginal_3d

width, height, pngData, metaData = png.Reader(file).asDirect()
planeCount = metaData['planes']
print('Image Size: ' + 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 // TODO: CREATE DEEP COPY

我的意图是编辑imageEdited_3d而不影响imageOriginal_3d中的值。但是,当我修改imageEdited_3d时,所做的更改当前也出现在imageOriginal_3d中。

nfeuvbwi

nfeuvbwi1#

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

imageEdited_3d = imageOriginal_3d.copy()

还有copy模块用于创建 deep copyshallow 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)
  • 说明:*
    浅拷贝构造一个新的复合对象,然后(尽可能地)将对原始对象的引用插入其中。
    deep copy构造一个新的复合对象,然后递归地将在原始对象中找到的对象的副本插入其中。

相关问题