【问题标题】:Can cPickle save reshaped numpy object reference?cPickle 可以保存重塑的 numpy 对象引用吗?
【发布时间】:2016-10-01 07:39:28
【问题描述】:

我有一个类定义为:

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的引用?

【问题讨论】:

    标签: python numpy pickle


    【解决方案1】:

    你可以使用__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
    

    【讨论】:

    • 为了避免混淆,我会使用“shape_of_b”而不是“b”。
    【解决方案2】:

    jsonpickle 的最新预发布版确实正确序列化了 numpy 视图;可悲的是泡菜没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 2019-11-01
      • 2013-07-20
      • 2018-07-06
      相关资源
      最近更新 更多