【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.深拷貝

參考鏈接:
1.https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.ndarray.base.html
2.https://blog.csdn.net/Jfuck/article/details/9464959
3.https://blog.csdn.net/qq_37553899/article/details/78793226

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章