【Numpy使用】numpy中的副本與檢視
阿新 • • 發佈:2018-12-21
對於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 True,ndarray.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)為什麼是不一樣的,但是他們之間是共享記憶體的?
對於物件a和物件b,可以理解為儲存了指向同一塊記憶體區域的地址,因為物件a和物件b是共享記憶體的,所以如果其中一個物件對資料進行改變,另外一個物件輸出資料後也會發生改變。而且物件b是通過物件a構造出來的,所以對於b而言,base屬性是指向a的。
但是物件a和物件b本身儲存的地址是不一樣的,相當於是構建了一個不一樣的指標,所以使用id進行判斷的時候是不同的。
2.檢視方式
對於一塊記憶體區域而言,其中的資料型別是不固定,只是對於這個記憶體區域資料的檢視方式是不同的。例如,如果物件a指向一個記憶體區域的一組資料,其表達的資料型別是整型,我們可以通過建立一個物件b指向物件a資料的不同試圖,比如用浮點數方式進行建立。