Standardmäßig wird durch das Beizen eines numpy View-Arrays die View-Beziehung verloren, auch wenn die Array-Basis ebenfalls gebeizt ist. Meine Situation ist, dass ich einige komplexe Containerobjekte habe, die gebeizt werden. Und in einigen Fällen sind einige enthaltene Daten Ansichten in einigen anderen. Das Speichern eines unabhängigen Arrays jeder Ansicht ist nicht nur ein Platzverlust, sondern die neu geladenen Daten haben auch die Sichtbeziehung verloren.Speichern der numpigen Ansicht beim Beizen
Ein einfaches Beispiel wäre (aber in meinem Fall sind die Behälter komplexer als ein Wörterbuch):
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
Meine Frage:
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
, die gedruckt werden würden
(1) Gibt es einen Weg, es zu bewahren? (2) (noch besser) ist es eine Möglichkeit, es nur zu tun, wenn die Basis
Für das gebeizte (1) Ich denke, es die __setstate__
, eine Möglichkeit sein kann __reduce_ex_
durch Veränderung, etc ... von der Array anzeigen. Aber ich traue mich erst jetzt nicht damit. Für die (2) habe ich keine Ahnung.