2016-10-01 68 views
2

我有一個類定義爲:cPickle可以保存重塑的numpy對象引用嗎?

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

現在,b爲實際上陣列的重整的參考。如果我們更改第一個元素:a[0] = 10,b[0, 0]也將更改爲10. 但是,當我加載轉儲時,我使用cPickle來保存此數組。 a和b成爲不同的陣列。我想知道是否有任何方法使b仍然是一個參考?

回答

0

您可以使用__getstate____setstate__控制泡菜:

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 
+0

我會使用「shape_of_b」而不是「b」來避免混淆。 –

0

jsonpickle的最新預發行不正確地序列numpy的意見;醃菜可悲不是。