Я создал подкласс numpy ndarray после документации numpy. В частности, я добавил пользовательский атрибут, изменив предоставленный код.
Я манипулирую экземпляры этого класса в параллельном цикле, используя Python multiprocessing
. Как я понимаю, способ, по которому объем по существу "копируется" в несколько потоков, использует pickle
.
Проблема, с которой я сейчас сталкиваюсь, связана с тем, как массируются массивы numpy. Я не могу найти исчерпывающей документации об этом, но некоторые обсуждения между разработчиками укропов предполагают, что я должен сосредоточиться на методе __reduce__
, который вызывает травление.
Может ли кто-нибудь пролить свет на это? Минимальный рабочий пример - это просто код примера numpy, связанный с ним выше, скопированный здесь для полноты:
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)
Теперь вот проблема:
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
Спасибо.