#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, к сожалению, этого не делает.