我编写了一个脚本来进行一些数据处理,然后在进行更多处理之前对结果进行 pickle ,这样我就可以调整最终的绘图参数。我正在挑选我创建的两个类的列表。 pickle 对每个列表都很好,但取消 pickle 一个列表会返回以下错误:
Traceback (most recent call last):
File "script.py", line 980, in <module>
main()
File "script.py", line 956, in promoter_main
open(os.path.join(pickle_dir, 'doublep.pickle'), 'rb'))
File "/usr/lib/python2.6/pickle.py", line 1370, in load
return Unpickler(file).load()
File "/usr/lib/python2.6/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.6/pickle.py", line 1217, in load_build
setstate(state)
File "/home/jmerkin/software/numpy/numpy/ma/core.py", line 5468, in __setstate__
ndarray.__setstate__(self, (shp, typ, isf, raw))
TypeError: object pickle not returning list
正如我所说,一个很好(SingleP 的实例列表),另一个在 unpickling 时给我这个错误(DoubleP 的实例)。我犹豫要不要发布该类的完整代码,因为它很长,但基本上,它有几个填充某些属性的方法。这些属性由 bool 值、元组列表、字符串、整数或 numpy.ma.arrays 列表组成。其中一些数组屏蔽了 numpy.nan。
这似乎是一个潜在的相关问题:http://projects.scipy.org/numpy/ticket/897 .在那种情况下,问题是数组的数据类型是 np.object。但是,我一直在 pickling 和 unpickling numpy.ma.arrays,包括屏蔽了 numpy.nan 的数组,很长一段时间都没有问题。
我是不是错过了 pickle 的一些愚蠢的东西?我不会在 pickle 对象和尝试取消 pickle 之间更改对象。
我重写了一些代码,这样我就没有将 n x m x l 维度的数组作为某些属性,而是有一个包含 n 个条目的列表,每个条目都是一个 m x l 数组,现在它很高兴,可以 pickle 和拆开。我很困惑,但它运行。我不会关闭它,因为我的问题仍然存在,为什么我会收到该错误?
请您参考如下方法:
有一个非常相似的问题:我重写了一个脚本,以便 np.nan 值也被屏蔽(我希望 numpy、scipy 和 matplotlib 可以一致地处理数组)但这导致了 pickle.load() 阻止。我摆脱了蒙面阵列,一切又恢复正常了。解决方案似乎是添加和删除掩码以取悦 pickle 。我知道这不是一个很好的解决方案,但它似乎有效。
