Может ли cPickle сохранить измененную ссылку на объект numpy?

#python #numpy #pickle

#python #numpy #рассол

Вопрос:

У меня есть класс, определенный как:

 class A():
    def __init__():
        self.a = np.array([0,1,2,3,4,5])
        self.b = self.a.reshape((2, 3))
  

теперь b фактически является измененной ссылкой на массив a. Если мы изменим первый элемент a: a[0] = 10 , b[0, 0] он также изменится на 10.
Однако я использую cPickle для сохранения этого массива при загрузке дампа. a и b становятся разными массивами. Я хочу знать, есть ли какой-либо способ сделать b по-прежнему ссылкой на a?

Ответ №1:

Вы можете использовать __getstate__ и __setstate__ для управления pickle:

 import numpy as np

class A:
    def __init__(self):
        self.a = np.array([0,1,2,3,4,5])
        self.b = self.a.reshape((2, 3))

    def __getstate__(self):
        return {"a":self.a, "b":self.b.shape}

    def __setstate__(self, state):
        self.a = state["a"]
        self.b = self.a.reshape(state["b"])

import pickle

x = A()
s = pickle.dumps(x)
y = pickle.loads(s)

y.b.base is y.a
  

Комментарии:

1. Я бы использовал «shape_of_b» вместо «b», чтобы избежать путаницы.

Ответ №2:

последняя предварительная версия jsonpickle корректно сериализует представления numpy; pickle, к сожалению, этого не делает.