Wy是不是考虑到可变/引用的对象?

时间:2016-11-20 10:57:28

标签: python numpy pickle

以下代码显示当你腌制两个对象时,当一个是另一个对象的引用时(是正确的单词吗?),在你腌制和加载之后该关系就会丢失。您可以在下方看到aa中的bb也发生了变化。但是,在对这种相同行为进行挑选和测试之后,我预计dd中的ee也会发生变化。但这种情况并非如此。你能解释一下发生了什么吗?

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 个答案:

答案 0 :(得分:1)

您期望的行为基于numpy的{​​{1}}概念,具有共享数据缓冲区的数组。 Pickle,显然使用view机制将数组保存为副本,每个副本都有自己的缓冲区。 np.save写入一个带有形状的标题,strides,dtype跟随数据缓冲区的字节副本。尝试用对仍在内存中的缓冲区的引用替换它,或者保存在另一个文件中,或者由另一个pickle步骤处理,如果不是不可能的话,那就很难了。此外,视图没有重播其创建历史记录的信息。

np.savea.T它是转置。它只知道它与一个或多个数组共享数据缓冲区。与know相同。

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

Can cPickle save reshaped numpy object reference?

另请查看a[2::2, ...]ee.flags,并与其他数组进行比较。