1. 程式人生 > >【Numpy使用】numpy中的副本與檢視

【Numpy使用】numpy中的副本與檢視

對於numpy中的array進行操作的時候,可以三種複製方式。
1.淺拷貝
2.檢視方式(view)
3.深拷貝(copy)

1.淺拷貝

直接進行賦值的方式,沒有新物件的構造,兩次建立的變數是指向相同的記憶體區域的。

import numpy as np
a = np.arange(50)
b = a
print(id(a), id(b))

利用id()驗證之後,發現a和b是指向相同記憶體區域的,只是換了一個名字。

import numpy as np
a = np.arange(50)
b = a.reshape((5, 10))
print(id(a), id(b))

利用id()驗證之後,發現結果是不一樣的。

注意:id() 函式用於獲取物件的記憶體地址。

import numpy as np
a = np.arange(50)
b = a.reshape((5, 10))
print(b is a)
print(b.base is a)

輸出結果是False Truendarray.base可以返回該陣列的基礎物件(如果這個陣列的記憶體是來源於其他物件的話)

import numpy as np
a = np.arange(50)
b = a.reshape((5, 10))
print(np.may_share_memory(a, b))

輸出結果是True,也就是說a和b是共享記憶體。

import numpy as np
a = np.arange(50)
b = a.reshape((5, 10))
print(a.flags['OWNDATA'])
print(a.flags.owndata)
print(b.flags['OWNDATA'])
print(b.flags.owndata)

輸出結果是True True False False

記憶體地址(id)為什麼是不一樣的,但是他們之間是共享記憶體的?
\quad對於物件a和物件b,可以理解為儲存了指向同一塊記憶體區域的地址,因為物件a和物件b是共享記憶體的,所以如果其中一個物件對資料進行改變,另外一個物件輸出資料後也會發生改變。而且物件b是通過物件a構造出來的,所以對於b而言,base屬性是指向a的。
\quad但是物件a和物件b本身儲存的地址是不一樣的,相當於是構建了一個不一樣的指標,所以使用id進行判斷的時候是不同的。

2.檢視方式

對於一塊記憶體區域而言,其中的資料型別是不固定,只是對於這個記憶體區域資料的檢視方式是不同的。例如,如果物件a指向一個記憶體區域的一組資料,其表達的資料型別是整型,我們可以通過建立一個物件b指向物件a資料的不同試圖,比如用浮點數方式進行建立。

3.深拷貝