欢迎这位怪蜀黍来到《Python机器学习(四十八)NumPy 副本和视图 - 大码王 - 博客园》

关闭页面特效

 


数组副本是内容与原数组相同,存储在另一个内存位置的数组。

数组视图是由原数组生成的另一个数组,但是与原数组共享数组元素内存,是对同一个内存位置所存储数组元素的不同呈现。

数组引用是原数组的别名,与原数组是同一个数组。

数组赋值

NumPy中,把一个数组赋值给另一个数组,不会拷贝数组,赋值只是对原始数组的引用。对被赋值数组做的更改也会反映在原始数组中。

id()函数返回数组的通用标识符,类似于C语言中的指针。

示例

复制代码
import numpy as np  

a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])  

print("原始数组:")
print(a)
print('\n')  

print("数组a的ID:", id(a))  

b = a   

print("\n赋值操作 b = a:")  

print("\nb的ID:",id(b))  

b.shape = 4,3;  

print("\nb上的修改也反映到a上:")  
print(a)  
复制代码

输出

复制代码
原始数组:
 [[ 1  2  3  4]
  [ 9  0  2  3]
  [ 1  2  3 19]]

数组a的ID: 140377691416656

赋值操作 b = a:

b的ID: 140377691416656

b上的修改也反映到a上:
[[ 1  2  3]
 [ 4  9  0]
 [ 2  3  1]
 [ 2  3 19]]
复制代码

ndarray.view()

view()方法返回新的数组对象,但数组元素数据与原始数组共享,因此是浅拷贝。与前面的情况不同,新数组的维数更改不会影响原数组的维数。

示例

复制代码
import numpy as np  

a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])  

print("原始数组:\n",a)  

print("\na的ID:",id(a))  

b = a.view()  

print("\nb的ID:",id(b))  

print("\n打印b的view")  
print(b)  

b.shape = 4,3;  

print("\nb的维数更改不影响a")  
print("\n原始数组 \n",a)  
print("\nview\n",b)  


b[0, 0] = 100

print("\nb的元素更改会影响a")  
print("\n原始数组 \n",a)  
print("\nview\n",b)  
复制代码

输出

复制代码
原始数组:
 [[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

a的ID: 140249104167360

b的ID: 140249103376752

打印b的view
[[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

b的维数更改不影响a

原始数组
 [[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

view
 [[ 1  2  3]
 [ 4  9  0]
 [ 2  3  1]
 [ 2  3 19]]

b的元素更改会影响a

原始数组
 [[100   2   3   4]
 [  9   0   2   3]
 [  1   2   3  19]]

view
 [[100   2   3]
 [  4   9   0]
 [  2   3   1]
 [  2   3  19]]
复制代码

ndarray.copy()

copy()返回原始数组的深层副本,该副本不与原始数组共享任何内存,是深拷贝。对数组副本所做的修改不会影响原始数组。

示例

复制代码
import numpy as np  

a = np.array([[1,2,3,4],[9,0,2,3],[1,2,3,19]])  

print("原始数组:\n", a)  

print("\na的ID:", id(a))  

b = a.copy()  

print("\nb的ID:", id(b))  

print("\n打印b")  
print(b)  

b.shape = 4,3;  

print("\nb的维数更改不影响a")  
print("\n原始数组a \n", a)  
print("\n数组副本b \n", b)  


b[0, 0] = 100

print("\nb的元素更改不影响a")  
print("\n原始数组a \n", a)  
print("\n数组副本b \n", b)  
复制代码

输出

复制代码
原始数组:
 [[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

a的ID: 140312719819200

b的ID: 140312509357872

打印b
[[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

b的维数更改不影响a

原始数组a
 [[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

数组副本b
 [[ 1  2  3]
 [ 4  9  0]
 [ 2  3  1]
 [ 2  3 19]]

b的元素更改不影响a

原始数组a
 [[ 1  2  3  4]
 [ 9  0  2  3]
 [ 1  2  3 19]]

数组副本b
 [[100   2   3]
 [  4   9   0]
 [  2   3   1]
 [  2   3  19]]
复制代码

 

 posted on   大码王  阅读(265)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

成都

复制代码

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示

目录导航