Beim Beizen die Taubheit bewahren

Standardmäßig verliert das Beizen eines Arrays mit numpy-Ansicht die Ansichtsbeziehung, auch wenn die Array-Basis ebenfalls beizt ist. Meine Situation ist, dass ich einige komplexe Containerobjekte habe, die gebeizt werden. In einigen Fällen handelt es sich bei einigen enthaltenen Daten um Ansichten in anderen. Das Speichern eines unabhängigen Arrays für jede Ansicht ist nicht nur ein Platzverlust, sondern die neu geladenen Daten haben auch die Ansichtsbeziehung verloren.

Ein einfaches Beispiel wäre (aber in meinem Fall sind die Container komplexer als ein Wörterbuch):

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

was würde drucken:

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:

(1) Gibt es eine Möglichkeit, es zu bewahren? (2) (noch besser) gibt es eine Möglichkeit, dies nur zu tun, wenn die Basis eingelegt ist

Für die (1) denke ich könnte es einen Weg geben, indem man die__setstate__, __reduce_ex_, etc ... des View Arrays. Aber ich bin vorerst nicht zuversichtlich mit diesen. Für die (2) habe ich keine Ahnung.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage