デフォルトでは、配列ベースがpickleされていてもnumpyビュー配列をpicklingするとビューの関係が失われます。私の状況は、私はいくつかの複雑なコンテナオブジェクトをピクルされているということです。場合によっては、含まれているデータの中には、他のビューがあります。各ビューの独立した配列を保存するだけでなく、スペースの損失だけでなく、再ロードされたデータがビューの関係を失ってしまいます。pickling時のnumpyビューの保存
簡単な例は次のようになります(しかし、私の場合には、コンテナは、辞書よりも複雑です):
import numpy as np
import cPickle
tmp = np.zeros(2)
d1 = dict(a=tmp,b=tmp[:]) # d1 to be saved: b is a view on a
pickled = cPickle.dumps(d1)
d2 = cPickle.loads(pickled) # d2 reloaded copy of d1 container
print 'd1 before:', d1
d1['b'][:] = 1
print 'd1 after: ', d1
print 'd2 before:', d2
d2['b'][:] = 1
print 'd2 after: ', d2
印刷した:
d1 before: {'a': array([ 0., 0.]), 'b': array([ 0., 0.])}
d1 after: {'a': array([ 1., 1.]), 'b': array([ 1., 1.])}
d2 before: {'a': array([ 0., 0.]), 'b': array([ 0., 0.])}
d2 after: {'a': array([ 0., 0.]), 'b': array([ 1., 1.])} # not a view anymore
は私の質問:
( 1)それを保存する方法はありますか? (2)(より良い)ベースは、(1)私はなど、__reduce_ex_
、__setstate__
を変更することにより、いくつかの方法があるかもしれないと思うのために
を漬けされている場合にのみ、それを行う方法がある...のビュー配列。しかし、私は今はこれに自信を持っていません。 (2)私は分かりません。