2016-11-20 3 views
3

Der folgende Code zeigt, dass, wenn Sie zwei Objekte pickle, wenn man eine Referenz der anderen ist (ist das das richtige Wort?), Nach dem Gurken und Laden dieser Beziehung verloren geht. Unten können Sie sehen, dass Änderungen in aa auch in bb auftreten. Aber nach dem Beizen und dem Testen für dasselbe Verhalten würde ich erwarten, dass Änderungen in dd auch in ee auftreten. Aber das ist nicht der Fall. Kannst du mir bitte erklären, was passiert?Wy ist Gurke, die veränderbare/referenzierte Objekte nicht berücksichtigt?

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). 

Antwort

1

Das Verhalten Sie erwarten, basiert das numpy Konzept eines view, Arrays mit einem gemeinsamen Datenpuffer. Pickle, die den np.save Mechanismus verwendet, speichert die Arrays offenbar als Kopien mit jeweils eigenem Puffer. np.save schreibt eine Kopfzeile mit Form, strides, dtype folgte einer Byte-Kopie des Datenpuffers. Der Versuch, dies durch einen Verweis auf einen Puffer zu ersetzen, der sich noch im Speicher befindet oder in einer anderen Datei gespeichert ist oder der von einem anderen Beizschritt behandelt wird, ist umständlich, wenn nicht unmöglich. Auch eine Ansicht verfügt nicht über die Informationen zur Wiedergabe des Erstellungsverlaufs.

a.T ist nicht know es ist eine Transponierung. Es weiß nur, dass es den Datenpuffer mit einem oder mehreren Arrays teilt. Das Gleiche gilt für a[2::2, ...].

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

Can cPickle save reshaped numpy object reference?

Schauen Sie auch bei ee.flags und ee.__array_interface__, und mit dem anderen Arrays vergleichen.

Verwandte Themen