一、NumPy副本&视图
1.1 NumPy副本
-
副本是一个数据的完整拷贝。修改副本不会影响原始数据。
-
副本与原始数据存于物理内存的不同位置。
例程
import numpy as np a=np.array([1,2,3,4,5]) g=a.copy() # g是a的副本 g[0]=100 # 只是修改了副本,原始数据不受影响 print('a = ',a) print('g = ',g)
运行结果
a = [1 2 3 4 5] g = [100 2 3 4 5]
1.2 NumPy视图
- 类似C++中的引用
- 视图是原始数据的别名。修改视图会影响原始数据。
- 视图和原始数据表示同一个东西,只是名字不同。
例程
import numpy as np a=np.array([1,2,3,4,5]) g=a.view() # g是a的视图 g[0]=100 # 修改视图,原始数据受影响 print('a = ',a) print('g = ',g)
运行结果
a = [100 2 3 4 5] g = [100 2 3 4 5]
二、NumPy 副本&视图 实例
2.1 赋值
- 简单的赋值用的是视图,不会创建副本。
- 视图与原始数据有相同的id()(类似C/C++中指针)
例程
import numpy as np print('原始数据') a=np.arange(12) print('a = ',a) print('id(a) = ',id(a)) b=a #b是a的一个视图,即a和b是同一个东西 print('b = ',a) print('id(b) = ',id(a)) print() a.shape=3,4 # 修改a的形状 a[0,0]=555 # 修改a中的内容 print('修改a后,a和b发生了相同的变化') print('a = ',a) print('id(a) = ',id(a)) print('b = ',a) print('id(b) = ',id(a))
运行结果
原始数据 a = [ 0 1 2 3 4 5 6 7 8 9 10 11] id(a) = 1629934608528 b = [ 0 1 2 3 4 5 6 7 8 9 10 11] id(b) = 1629934608528 修改a后,a和b发生了相同的变化 a = [[555 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] id(a) = 1629934608528 b = [[555 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] id(b) = 1629934608528
2.2 切片
- 切片是视图
例程
import numpy as np a=np.arange(12) print('原始数据a = ',a) s1=a[2:4] print('切片s1 = ',s1) s2=a[4:5] print('切片s2 = ',s2) s1[0]=52 s2[0]=66 print('修改切片后,原始数据也发生改变') print('修改切片后a = ',a)
运行结果
原始数据a = [ 0 1 2 3 4 5 6 7 8 9 10 11] 切片s1 = [2 3] 切片s2 = [4] 修改切片后,原始数据也发生改变 修改切片后a = [ 0 1 52 3 66 5 6 7 8 9 10 11]