NumPy 1.14 教學 – #06 簡易指定(Simple Assignments), 檢視(Views), 深度拷貝(Deep Copy)

開始學NumPy之前至少先熟悉Python基礎使用方法,這樣再來看NumPy才不會那麼吃力!
Python3 教學、筆記

NumPy提供了簡易指定Simple Assignments、檢視View、深度拷貝Deep Copy等方法,本文就會針對這幾種方法的差異做介紹!
這是因為陣列這類包含大量指標的變數,對於程式語言來說,通常會兩種複製的方法,一種是類似於捷徑的做法,另一種則是以建立完整的內容來達成相同的效果。但兩者在使用上會有不同的效果!在撰寫時也必須要視情況而定!

本內容的的練習範例同步放置於GitHub:Learn NumPy – GitHub

Simple Assignments

簡易指定

簡易指定最主要的概念在於,NumPy會直接把變數的內容以記憶體指標指向你要的內容。
因此,這種做法是不會創造新的資料的。有點像是作業系統中軟捷徑的概念!

Output

 

我們來改變原陣列形狀,看看簡易指定後的變數是否也會跟著改變!!

Output

 

簡易指定的變數,本質上根本就是指標。
後續會以『base、flags.owndata』這兩個屬性來比較view(淺拷貝, shadow copy)與深拷貝(deep copy)之間的差異。

Output

 

View / Shadow Copy

檢視/淺拷貝

檢視就是淺拷貝,跟簡易指定很相似,但是相較起來檢視會比較正式喔!
首先,先把陣列宣告好~

Output

 

(1)變更c的形狀、(2)變更c[1, 2]的內容,來觀察a是否也會改變!

Output

 

查看『base、flags.owndata』之後可以發現,檢視和簡易指定的差別在於owndata。
檢視的owndata值是False,代表檢視沒有自己的記憶體儲存空間,所以它是去參考別人的啦。(其實我也不太懂為何這個差異會造成使用上的差別)  原文解釋在這:numpy.ndarray.flags

此外,檢視(view)和簡易指定(simple assignments)使用上的差異在於,更改檢視的形狀是不會影響原本的參考來源變數的形狀喔!(可以看一下前面的例子)

Output

 

Deep Copy

深度拷貝

深度拷貝和上述簡易指定與檢視最大不同之處在於,深度拷貝會建立一個完全獨立的物件,包括記憶體空間。
所以,變數b並沒有參考任何變數!b.base會顯示None。

numpy.ndarray.base:如果有參考其他物件的記憶體時,會顯示

Output

 

來測試一下!

Output

 




Andy Wang

站在巨人的肩膀上仍須戰戰兢兢!

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *