NumPy的深浅拷贝的区别与选择

简介: 关于深浅拷贝如何进行选择, 我们需要根据实际的项目需求进行使用,选择正确的拷贝方式不但能够节省内存空间,而且在效率上也会大大提高,这也是我们在项目优化方面需要进行考虑的。

大家好,我们知道中华上下五千年。习武之人不在少数。但是他们习武的类型也大概分成两种:一种是外功,主要学习手法,腿法等的力量和协调性;另一种是内功,主要锻炼的是气力,骨骼等内在的改变。

在学习Numpy库中的副本和视图的时候,接触到了其中有一个数据拷贝的选择,它跟习武的方式类似,分为深拷贝和浅拷贝。那么究竟他们有什么区别?如何进行选择?本文将带领我们一探究竟!

知道

首先,在研究深浅拷贝之前,得知道相关的一些概念这样,后面我们才能游刃有余。比如我们在看本文内容之前,你是否学习了Python基础,NumPy环境是否已经安装完成。🎯


好了,现在正式进入我们的内容。

什么是深拷贝?

深拷贝指在拷贝原数组的时候,会在内存中重新创建一个新的数组并且进行赋值,新数组中的元素进行任何操作的时候,是不会影响到原数组的,他们在数组中的内存id是不同的


什么是浅拷贝?

浅拷贝指在拷贝原数组的时候,它只不过是原数组的一个引用,并不会再内存中创建一个新的数组,所以在操作新数组中的元素的时候,原数组也是会跟着一起变化的,会影响到原数组的数组结构。


既然我们已经知道了什么是深拷贝,什么是浅拷贝。那么光凭理论是说不过去的,我们得进行实践。记得有一句话说的:“实践是检验真理的唯一途径”。那么我们开始吧!🧐

验证

首先我们得保证安装了Pyhton的编辑器,我用的是PyCharm,没有的可以在官网自行下载安装。


这里Numpy库给我们提供的深拷贝的函数是copy()函数,我们就使用这个函数进行验证。


先在编辑器中创建一个数组,并进行数组的深拷贝,查看结果如何?

"""
@Created on : 2024/6/17 11:16
@creator : er_nao
@File :numpy_28_副本和视图.py
@Description :
"""
import numpy as np
# copy()函数的使用
x = np.arange(32).reshape(4, 8)
print('原数组')
print(x)
# 获取数组在内存中的id
print('x数组的id: ')
print(id(x))
print('\n')
# 将x数组copy给y
y = x.copy()
print('y数组的id:')
print(id(y))
print('\n')
# 修改y数组,测试x数组是否会发生变化
y.shape = 8, 4
print('打印y数组')
print(y)
print('\n')
print('打印x数组')
print(x)
# # 输出结果
# 原数组
# [[ 0  1  2  3  4  5  6  7]
#  [ 8  9 10 11 12 13 14 15]
#  [16 17 18 19 20 21 22 23]
#  [24 25 26 27 28 29 30 31]]
# x数组的id: 
# 1972961081072
# 
# 
# y数组的id:
# 1973520214672
# 
# 
# 打印y数组
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]
#  [16 17 18 19]
#  [20 21 22 23]
#  [24 25 26 27]
#  [28 29 30 31]]
# 
# 
# 打印x数组
# [[ 0  1  2  3  4  5  6  7]
#  [ 8  9 10 11 12 13 14 15]
#  [16 17 18 19 20 21 22 23]
#  [24 25 26 27 28 29 30 31]]


我们可以看到,创建了一个原数组x,然后将x数组深拷贝给新数组y,输出的结果显而易见,x在内容中的id和y的id是不一样的,显然这儿变成了两个不同的数组,然后使用shape函数,进行y数组的变化,输出结果是y数组格式已经变化,而原数组并没有收到影响。


下来我们验证浅拷贝,浅拷贝其实就比较简单了,就是数组之间的赋值。我们来看一下相关代码

# 传统数组之间相互赋值
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print('原数组')
print(x)
# 获取数组在内存中的id
print('x数组的id: ')
print(id(x))
print('\n')
# 将x数组赋值给y
y = x
print('y数组的id:')
print(id(y))
print('\n')
# 修改y数组,测试x数组是否会发生变化
y.shape = 2, 4
print('打印y数组')
print(y)
print('\n')
print('打印x数组')
print(x)
# 输出结果
# 原数组
# [1 2 3 4 5 6 7 8]
# x数组的id: 
# 1795409508176
# 
# 
# y数组的id:
# 1795409508176
# 
# 
# 打印y数组
# [[1 2 3 4]
#  [5 6 7 8]]
# 
# 
# 打印x数组
# [[1 2 3 4]
#  [5 6 7 8]]


这次我们可以很清晰的看到,将x数组赋值给数组y,改变数组y以后,x也改变了。并且他们的内存id都是一样的。


其实NumPy库还给我们提供了一种浅拷贝的方法, 使用view()函数进行拷贝。

# 创建原始数组
arr = np.array([2, 4, 8, 12, 20])
# 使用view函数创建视图
view_arr = arr.view()
# 修改原始数组中的元素
arr[0] = 100
# 输出修改后的结果
print("原数组id:", id(arr))
print("视图数组id:", id(view_arr))
print("原数组:", arr)
print("视图数组:", view_arr)
# 输出结果
# 原数组id: 1958732690896
# 视图数组id: 1958732691280
# 原数组: [100   4   8  12  20]
# 视图数组: [100   4   8  12  20]


我们发现,view()函数的是创建一个新的视图,但是它在元素内存的指向和原数组的相同的,改变原数值的元素,创建的视图元素也随之改变。

清楚

以上就是本文的全部内容,关于深浅拷贝如何进行选择, 我们需要根据实际的项目需求进行使用,选择正确的拷贝方式不但能够节省内存空间,而且在效率上也会大大提高,这也是我们在项目优化方面需要进行考虑的。

相关文章
|
Python
【Numpy】深入剖析Numpy.arange()与range()的区别
【Numpy】深入剖析Numpy.arange()与range()的区别
169 0
|
Python
numpy数组中冒号[:,:,0]与[...,0]的区别
x[:,:,0] 意思是对数组x切片,可以想象成一个正方体数据,每次切下一个面的数据。第二维取0则得出来[3,4]大小的数组
210 0
|
机器学习/深度学习 存储 Serverless
NumPy 与 Python 内置列表计算标准差的区别
NumPy,是 Numerical Python 的简称,用于高性能科学计算和数据分析的基础包,像数学科学工具(pandas)和框架(Scikit-learn)中都使用到了 NumPy 这个包。
|
Python
numpy中dot与*的区别
dot是矩阵相乘,只要矩阵满足前一个矩阵的列与后一个矩阵的行相匹配即可 *是遵循numpy中的广播机制,必须保证行列相对应才可以进行运算 先看一则正例 >>import numpy as np #test1与test2行列相同 >>test1 = np.
1108 0
|
3月前
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
104 0
|
4月前
|
机器学习/深度学习 数据处理 计算机视觉
NumPy实践宝典:Python高手教你如何轻松玩转数据处理!
【8月更文挑战第22天】NumPy是Python科学计算的核心库,专长于大型数组与矩阵运算,并提供了丰富的数学函数。首先需安装NumPy (`pip install numpy`)。之后可通过创建数组、索引与切片、执行数学与逻辑运算、变换数组形状及类型、计算统计量和进行矩阵运算等操作来实践学习。NumPy的应用范围广泛,从基础的数据处理到图像处理都能胜任,是数据科学领域的必备工具。
64 0
|
1月前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
47 3
|
1月前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
65 2
|
3月前
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
58 5
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
2月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
94 10