Search code examples
pythonnumpycopy

Create a copy and not a reference of a NumPy array


I'm currently working on a Python program that involves using NumPy for image processing. However, I've encountered an issue when trying to create a deep copy of a NumPy array instead of just copying the reference.

Here's a snippet of my code, where I read in a PNG image and assign it to 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

My intention is to edit imageEdited_3d without affecting the values in imageOriginal_3d. However, when I modify imageEdited_3d, the changes currently also appear in imageOriginal_3d.


Solution

  • You need to create the copy of the object. You may do it using numpy.copy() since you are having numpy object. Hence, your initialisation should be like:

    imageEdited_3d = imageOriginal_3d.copy()
    

    Also there is copy module for creating the deep copy OR, shallow copy. This works independent of object type. For example, your code using copy should be as:

    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)
    

    Description:

    A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.

    A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.