Zachowanie widoku numpy podczas wytrawiania
Domyślnie, trawienie tablicy widoków numpy powoduje utratę relacji widoku, nawet jeśli baza tablicowa jest także piklowana. Moja sytuacja jest taka, że mam kilka złożonych obiektów kontenerowych, które są marynowane. W niektórych przypadkach niektóre zawarte dane są widokami w innych. Zapisywanie niezależnej tablicy każdego widoku to nie tylko utrata miejsca, ale także przeładowane dane utraciły relację widoku.
Prostym przykładem może być (ale w moim przypadku kontener jest bardziej złożony niż słownik):
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
który drukowałby:
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
Moje pytanie:
(1) Czy istnieje sposób, aby go zachować? (2) (nawet lepiej) jest sposób na zrobienie tego tylko wtedy, gdy baza jest marynowana
Dla (1) myślę, że może być jakiś sposób, zmieniając__setstate__
, __reduce_ex_
, etc ... tablicy widoków. Ale na razie nie jestem z nimi pewny. Dla (2) nie mam pojęcia.