Python序列化错误:TypeError:对象pickle未返回列表。与numpy有关吗?

2 投票
1 回答
1565 浏览
提问于 2025-04-17 10:31

我写了一个脚本,用来处理一些数据,然后把结果保存起来(这叫做“打包”),接着再进行一些处理,这样我就可以调整最后的参数来绘图。我打包了我创建的两个类的列表。对于每个列表的打包都没问题,但在解包其中一个列表时出现了错误:

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类的实例)打包和解包都很顺利,而另一个(DoubleP类的实例)在解包时却给我报了这个错。我不太想把整个类的代码贴出来,因为它很长,但基本上,它有几个方法用来填充一些属性。这些属性可以是布尔值、元组列表、字符串、整数,或者是numpy的数组列表。其中一些数组包含了被遮罩的numpy.nan。

这似乎是一个可能相关的问题:http://projects.scipy.org/numpy/ticket/897。在那个案例中,问题出在数组的类型是np.object。不过,我一直在打包和解包numpy的数组,包括那些有被遮罩的numpy.nan的数组,没遇到过问题。

我是不是在打包时漏掉了什么简单的东西?在打包和解包之间,我并没有改变对象。


我重写了一些代码,把原本作为属性的n x m x l维数组,改成了一个有n个条目的列表,每个条目是一个m x l的数组,现在它就能正常打包和解包了。我感到很困惑,但它能运行。我不会关闭这个问题,因为我还是想知道,为什么我会遇到那个错误?

相关问题:

1 个回答

0

我遇到了一个很相似的问题:我重写了一个脚本,让np.nan的值也被遮罩处理(我真希望numpy、scipy和matplotlib能对数组的处理保持一致),但这导致pickle.load()出错了。我把遮罩数组去掉后,一切又正常了。解决办法似乎就是添加和去掉遮罩,以便让pickle满意。我知道这不是一个很好的解决方案,但确实有效。

撰写回答