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

np.copy到底是深拷贝还是浅拷贝

  • 实验
    • [1. 拷贝矩阵](#1. 拷贝矩阵)
      • [2. 修改m的值](#2. 修改m的值)
      • [3. 修改拷贝矩阵的值](#3. 修改拷贝矩阵的值)
  • 官方文档

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

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

实验

1. 拷贝矩阵

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

python 复制代码
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

输出:

python 复制代码
>>> 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的值

python 复制代码
m[0][0]=-1

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

python 复制代码
>>> 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值都没有改变

python 复制代码
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值不变

python 复制代码
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
相关推荐
python-码博士29 分钟前
PyTorch 从零实现 Flow Matching:训练、采样、画图一条龙
人工智能·pytorch·python
王小王-1231 小时前
基于Python的车联网数据聚合与可视化分析平台设计与实现
python·车联网·新能源汽车·车联网聚合分析
叫我:松哥1 小时前
基于Flask框架的校园二手书籍交易平台,注重校园场景的特殊需求,通过学号认证保障用户真实性
后端·python·sqlite·flask·bootstrap
namexingyun2 小时前
开源前端生态如何成为 AI UI 生成的“燃料“:shadcn/ui、Tailwind CSS、Storybook 技术价值全解剖
java·前端·人工智能·python·ui·开源·ai编程
通信仿真爱好者2 小时前
第【17】期--考虑硬件损伤和不完美CSI的RIS-MISO系统的深度强化学习联合优化-python完整代码+参考文献
python·深度强化学习·ris
装不满的克莱因瓶2 小时前
自然语言处理常见任务——从文本理解到生成式AI的完整任务体系
人工智能·pytorch·python·深度学习·ai·自然语言处理
ptc学习者2 小时前
python 中描述符@property property 大概的样子
开发语言·python
zmzb01032 小时前
Python课后习题训练记录Day129
开发语言·python
秋92 小时前
Python工程师面试常问提问和回答(AI工程化方向 · 2026版)
人工智能·python·面试
炎武丶航2 小时前
LeNet-5深度学习详解:从手写数字识别到代码实战
人工智能·python·深度学习·机器学习·ai·cnn·lenet