Per impostazione predefinita, il decollo di una matrice di visualizzazione numpy perde la relazione di visualizzazione, anche se anche la base dell'array viene decapata. La mia situazione è che ho alcuni oggetti contenitori complessi che sono in salamoia. E in alcuni casi, alcuni dati contenuti sono visualizzazioni in altri. Il salvataggio di una matrice indipendente di ciascuna vista non è solo una perdita di spazio, ma anche i dati ricaricati hanno perso la relazione della vista.Conservazione della visualizzazione numpy durante il decapaggio
Un semplice esempio potrebbe essere (ma nel mio caso il contenitore è più complesso di un dizionario):
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
che sarebbe stampare:
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
La mia domanda:
(1) C'è un modo per preservarlo? (2) (ancora meglio) c'è un modo per farlo solo se la base è in salamoia
Per la (1) Penso che ci può essere qualche modo cambiando il __setstate__
, __reduce_ex_
, ecc ... del vedi matrice. Ma per ora non mi confido con questi. Per il (2) non ne ho idea.