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
相关推荐
烛阴4 小时前
简单入门Python装饰器
前端·python
好开心啊没烦恼4 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开4 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式
2301_805054566 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python
万千思绪6 小时前
【PyCharm 2025.1.2配置debug】
ide·python·pycharm
微风粼粼8 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
云天徽上8 小时前
【PaddleOCR】OCR表格识别数据集介绍,包含PubTabNet、好未来表格识别、WTW中文场景表格等数据,持续更新中......
python·ocr·文字识别·表格识别·paddleocr·pp-ocrv5
你怎么知道我是队长8 小时前
python-input内置函数
开发语言·python
叹一曲当时只道是寻常8 小时前
Python实现优雅的目录结构打印工具
python
hbwhmama9 小时前
python高级变量XIII
python