Numpy系列(五)- 复制和视图


当计算和操作数组时,它们的数据有时被复制到新的数组中,有时不复制。这里我们做个区分。

    完全不复制

简单赋值不会创建数组对象或其数据的拷贝。

import numpy as np
a = np.arange(6)  
a
Out[165]: array([0, 1, 2, 3, 4, 5])
b = a 
id(a)
Out[166]: 336914267312
id(b) # id(a)和id(b)结果相同
Out[167]: 336914267312
b.shape =  3,2
a.shape # 修改b形状,结果a的形状也变了
Out[170]: (3, 2)
b[0,0] = 12 #修改b的值,结果a的值也变化
b
Out[168]: 
array([[12,  1],
       [ 2,  3],
       [ 4,  5]])
a
Out[169]: 
array([[12,  1],
       [ 2,  3],
       [ 4,  5]])

 视图或浅复制

不同的数组对象可以共享相同的数据。view方法创建一个新数组对象,该对象看到相同的数据。与前一种情况不同,新数组的维数更改不会更改原始数据的维数,但是新数组数据更改后,也会影响原始数据。

c = a.view()
c is a
Out[171]: False
c.base is a
Out[172]: True
c.flags.owndata
Out[173]: False
c.shape = 2,3 #c的维度更改,a的维度不变
a.shape
Out[174]: (3, 2)
c[0,1] = 1234 #c的值变化,a的值也变化
a
Out[175]: 
array([[  12, 1234],
       [   2,    3],
       [   4,    5]])

  深复制

copy方法生成数组及其数据的完整拷贝。

d = a.copy()
d
Out[176]: 
array([[  12, 1234],
       [   2,    3],
       [   4,    5]])
d is a
Out[177]: False
d.base is a
Out[178]: False
d[0,0] = 9999 #修改数组d的值,a不会受影响
d
Out[179]: 
array([[9999, 1234],
       [   2,    3],
       [   4,    5]])
a
Out[180]: 
array([[  12, 1234],
       [   2,    3],
       [   4,    5]])