Numpy系列(五)- 複製和視圖

當計算和操做數組時,它們的數據有時被複制到新的數組中,有時不復制。這裏咱們作個區分。python

    徹底不復制

簡單賦值不會建立數組對象或其數據的拷貝。數組

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方法建立一個新數組對象,該對象看到相同的數據。與前一種狀況不一樣,新數組的維數更改不會更改原始數據的維數,可是新數組數據更改後,也會影響原始數據。spa

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方法生成數組及其數據的完整拷貝。code

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]])
相關文章
相關標籤/搜索