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]]

 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值