np.copy()是深拷贝还是浅拷贝

最近在用numpy的拷贝操作,发现网上对np.copy()究竟是深拷贝还是浅拷贝说法不一致,因此记录一下。

总结:如果numpy array是一个简单的数组,np.copy()是深拷贝。如果numpy array内包含了对象,np.copy()是浅拷贝。
ps: arr.copy = np.copy(arr)

实验

1. 拷贝矩阵

原始矩阵m,分别用两种不同的方式拷贝。用np.copy()得到n, 用浅拷贝得到z

import numpy as np
m = np.array([[0,1,2],[1,2,3],[3,4,5]])
# numpy拷贝, 等同于n = np.copy(m)
n = m.copy()
# 浅拷贝
z = m

输出:

>>> m
array([[0, 1, 2],
       [1, 2, 3],
       [3, 4, 5]])
>>> n
array([[0, 1, 2],
       [1, 2, 3],
       [3, 4, 5]])
>>> z
array([[0, 1, 2],
       [1, 2, 3],
       [3, 4, 5]])

2. 修改m的值

m[0][0]=-1

修改m的值后,使用np.copy的n值没有改变,浅拷贝z的值发生了改变

>>> m
array([[-1,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> n
array([[0, 1, 2],
       [1, 2, 3],
       [3, 4, 5]])
>>> z
array([[-1,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])

3. 修改拷贝矩阵的值

修改n的值,mz值都没有改变

n[0][0]=-2

>>> m
array([[-1,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> n
array([[-2,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> z
array([[-1,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])

修改z的值,m值改变和n值不变

z[0][0]=-3

array([[-3,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> n
array([[-2,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])
>>> z
array([[-3,  1,  2],
       [ 1,  2,  3],
       [ 3,  4,  5]])

因此np.copy从以上的例子来看是深拷贝, =是浅拷贝

官方文档

但是在 numpy官方文档中明确提到np.copy是浅拷贝。原因是如果array里的元素是一个对象时,如果对象的元素改变,原来的array的对象也会改变。也就是说numpy array中对象元素的拷贝是浅拷贝。

Note that np.copy is a shallow copy and will not copy object elements within arrays. This is mainly important for arrays containing Python objects. The new array will contain the same object which may lead to surprises if that object can be modified (is mutable):

a = np.array([1, 'm', [2, 3, 4]], dtype=object)
b = np.copy(a)
b[2][0] = 10
a
array([1, 'm', list([10, 3, 4])], dtype=object)

To ensure all elements within an object array are copied, use copy.deepcopy:

import copy
a = np.array([1, 'm', [2, 3, 4]], dtype=object)
c = copy.deepcopy(a)
c[2][0] = 10
c
array([1, 'm', list([10, 3, 4])], dtype=object)
a
array([1, 'm', list([2, 3, 4])], dtype=object)

参考文档

  1. 官方文档
  2. 博客1
  3. 博客2

相关推荐

  1. np.copy()拷贝拷贝

    2023-12-29 19:34:04       56 阅读
  2. 什么拷贝拷贝

    2023-12-29 19:34:04       46 阅读
  3. 拷贝拷贝

    2023-12-29 19:34:04       38 阅读
  4. 拷贝拷贝

    2023-12-29 19:34:04       35 阅读
  5. 拷贝拷贝

    2023-12-29 19:34:04       32 阅读
  6. 拷贝拷贝

    2023-12-29 19:34:04       38 阅读
  7. c++拷贝拷贝

    2023-12-29 19:34:04       33 阅读
  8. 拷贝拷贝

    2023-12-29 19:34:04       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 19:34:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 19:34:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 19:34:04       82 阅读
  4. Python语言-面向对象

    2023-12-29 19:34:04       91 阅读

热门阅读

  1. 【leetcode100-024】【链表/快慢指针】回文链表

    2023-12-29 19:34:04       56 阅读
  2. es修改mapping映射

    2023-12-29 19:34:04       99 阅读
  3. php遍历文件夹

    2023-12-29 19:34:04       58 阅读
  4. JDBC学习笔记第十一篇

    2023-12-29 19:34:04       67 阅读
  5. Qt/QML编程学习之心得:loader和component(二十)

    2023-12-29 19:34:04       59 阅读
  6. Unity Timer两种计时器

    2023-12-29 19:34:04       48 阅读