NumPy 副本与视图(copy & view)

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