2016-11-20 17 views
3

下面的代碼顯示,當你醃製兩個對象時,當一個是另一個的引用(是否是正確的單詞?),在你醃製並加載該關係後丟失。在下面,您可以看到aa中的更改也發生在bb中。但是,在對相同行爲進行醃製和測試之後,我預計dd的變化也會發生在ee中。但這種情況並非如此。你能解釋一下發生了什麼嗎?Wy是不考慮可變/引用對象的泡菜?

import numpy as np 
aa=np.ones((5,3)) 
print 'aa',aa 
bb=aa.T 
aa[2,2]=3 
print 'aa',aa, aa.nbytes 
print 'bb', bb, bb.nbytes #bb also prints out hte affect of the change from aa. OK 

import pickle 
pickle.dump([aa,bb], open("save.p", "wb")) 
with open("save.p", "rb") as f: 
    dd,ee=pickle.load(f) 
print 'dd',dd 
print 'ee',ee 
dd[1,0]=5 #shouldn't this affect ee also? 

print 'dd',dd 
print 'ee',ee # is different than dd. I would have expected that they should be the same (except for the transpose). 

回答

1

您所期望的行爲基於一個viewnumpy概念,與共享數據緩衝器陣列。 Pickle使用np.save機制顯然是將陣列保存爲副本,每個都有自己的緩衝區。 np.save用shape,strides,dtype寫了一個頭,後面跟着數據緩衝區的一個字節副本。嘗試用一個對仍然在內存中,或者保存在另一個文件中,或者由另一個pickle步驟處理的緩衝區的引用來替換它,如果不是不可能的話,則步驟是尷尬的。視圖也沒有重放其創建歷史記錄的信息。

a.T不是know這是一個轉置。它只知道它與一個或多個數組共享數據緩衝區。 a[2::2, ...]也一樣。

https://docs.scipy.org/doc/numpy/neps/npy-format.html

Can cPickle save reshaped numpy object reference?

也期待在ee.flagsee.__array_interface__,並與其他陣列進行比較。