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