Preservando a visão numpy quando decapagem
Por padrão, decodificar uma matriz de visualização numpy perde o relacionamento de exibição, mesmo se a base da matriz também for decapada. Minha situação é que eu tenho alguns objetos contêineres complexos que são decapados. E, em alguns casos, alguns dados contidos são vistos em outros. Salvar uma matriz independente de cada visualização não é apenas uma perda de espaço, mas também os dados recarregados perderam a relação de exibição.
Um exemplo simples seria (mas no meu caso o container é mais complexo que um dicionário):
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
qual imprimiria:
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
Minha pergunta:
(1) Existe uma maneira de preservá-lo? (2) (melhor ainda) existe uma maneira de fazer isso apenas se a base estiver em conserva
Para o (1) eu acho que pode haver alguma maneira, alterando o__setstate__
, __reduce_ex_
, etc ... da matriz de exibição. Mas eu não me preocupo com isso por enquanto. Para o (2) não tenho ideia.