Preserve benutzerdefinierte Attribute beim Beizen der Unterklasse von Numpy Array
Ich habe eine Unterklasse von numpy ndarray nach @ erstelldie numpy Dokumentation. Insbesondere habe ich ein benutzerdefiniertes Attribut hinzugefügt durch Ändern des bereitgestellten Codes.
Ich bearbeite Instanzen dieser Klasse in einer parallelen Schleife mit Pythonmultiprocessing
. Wie ich es verstehe, verwendet die Art und Weise, wie der Gültigkeitsbereich im Wesentlichen in mehrere Threads 'kopiert' wird,pickle
.
Das Problem, auf das ich jetzt stoße, betrifft die Art und Weise, wie numpy Arrays eingelegt werden. Ich kann keine umfassende Dokumentation zu diesem Thema finden, aber einigediskussionen zwischen den Dill-Entwicklern schlagen vor, dass ich mich auf das @ konzentrieren soll__reduce__
Methode, die beim Beizen aufgerufen wird.
Kann jemand mehr Licht ins Dunkel bringen? Das minimale Arbeitsbeispiel ist wirklich nur der numpy Beispielcode, den ich oben verlinkt habe. Der Vollständigkeit halber hier kopiert:
import numpy as np
class RealisticInfoArray(np.ndarray):
def __new__(cls, input_array, info=None):
# Input array is an already formed ndarray instance
# We first cast to be our class type
obj = np.asarray(input_array).view(cls)
# add the new attribute to the created instance
obj.info = info
# Finally, we must return the newly created object:
return obj
def __array_finalize__(self, obj):
# see InfoArray.__array_finalize__ for comments
if obj is None: return
self.info = getattr(obj, 'info', None)
Jetzt ist hier das Problem:
import pickle
obj = RealisticInfoArray([1, 2, 3], info='foo')
print obj.info # 'foo'
pickle_str = pickle.dumps(obj)
new_obj = pickle.loads(pickle_str)
print new_obj.info # raises AttributeError
Vielen Dank