Preservando la vista numpy cuando decapamos

De forma predeterminada, la selección de una matriz de vista numpy pierde la relación de vista, incluso si la base de la matriz también se decrece. Mi situación es que tengo algunos objetos contenedores complejos que son decapados. Y en algunos casos, algunos datos contenidos son vistas en otros. Guardar una matriz independiente de cada vista no solo es una pérdida de espacio sino que también los datos recargados han perdido la relación de vista.

Un ejemplo simple sería (pero en mi caso el contenedor es más complejo que un diccionario):

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

que imprimiría:

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

Mi pregunta:

(1) ¿Hay alguna manera de preservarlo? (2) (incluso mejor) hay una manera de hacerlo solo si la base está decapada

Para el (1) creo que puede haber alguna manera cambiando el__setstate__, __reduce_ex_, etc ... de la matriz de vistas. Pero no me siento seguro con esto por ahora. Para el (2) no tengo ni idea.

Respuestas a la pregunta(1)

Su respuesta a la pregunta