为什么 pickle 不考虑 mutable/referenced 个对象?
Wy is pickle not taking into account mutable/referenced objects?
以下代码表明,当您 pickle 两个对象时,当一个对象是另一个对象的引用时(这个词正确吗?),在 pickle 和加载之后这种关系就会丢失。在下面,您可以看到 aa
中的更改也发生在 bb
中。但是,在对相同的行为进行 pickle 和测试之后,我预计 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).
您期望的行为基于 view
的 numpy
概念,数组具有共享数据缓冲区。使用 np.save
机制的 Pickle 显然将数组保存为副本,每个副本都有自己的缓冲区。 np.save
写一个 header 形状,步幅,dtype 后跟数据缓冲区的字节副本。尝试将其替换为对仍在内存中、保存在另一个文件中或由另一个泡菜步骤处理的缓冲区的引用,如果不是不可能的话,也是很尴尬的。此外,视图没有重播其创建历史的信息。
a.T
不是 know
它是转置。它只知道它与一个或多个数组共享数据缓冲区。 a[2::2, ...]
.
相同
https://docs.scipy.org/doc/numpy/neps/npy-format.html
Can cPickle save reshaped numpy object reference?
同时查看 ee.flags
和 ee.__array_interface__
,并与其他数组进行比较。
以下代码表明,当您 pickle 两个对象时,当一个对象是另一个对象的引用时(这个词正确吗?),在 pickle 和加载之后这种关系就会丢失。在下面,您可以看到 aa
中的更改也发生在 bb
中。但是,在对相同的行为进行 pickle 和测试之后,我预计 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).
您期望的行为基于 view
的 numpy
概念,数组具有共享数据缓冲区。使用 np.save
机制的 Pickle 显然将数组保存为副本,每个副本都有自己的缓冲区。 np.save
写一个 header 形状,步幅,dtype 后跟数据缓冲区的字节副本。尝试将其替换为对仍在内存中、保存在另一个文件中或由另一个泡菜步骤处理的缓冲区的引用,如果不是不可能的话,也是很尴尬的。此外,视图没有重播其创建历史的信息。
a.T
不是 know
它是转置。它只知道它与一个或多个数组共享数据缓冲区。 a[2::2, ...]
.
https://docs.scipy.org/doc/numpy/neps/npy-format.html
Can cPickle save reshaped numpy object reference?
同时查看 ee.flags
和 ee.__array_interface__
,并与其他数组进行比较。