1

全部:

我正在尝试使用 dill 将我的 Python 程序中的所有数据保存到二进制文件中。我的程序同时使用了常规的 numpy 数组和 numpy 记录数组。如果我同时保存了 numpy 记录数组和常规数组,我在加载常规 numpy 数组时遇到问题。该问题可以通过以下简单代码来演示:

import dill as pickle
import numpy as np

class testdill:
   def __init__(self, data):
       self.data =data

# numpy record array type
personType = [('name', 'a32'), ('age', '<i2'), ('salary', '<i4'), ('weight','<f8')] 


person = np.zeros(2, dtype=personType, order='F')
d = np.random.randn(5)
d1 = testdill(d)

d = np.random.randn(5)
d2 = testdill(d)

d = np.random.randn(5)
d3 = testdill(d)


f= open('testdill.dat', 'wb')
pickle.dump(person, f) 
pickle.dump(d1, f)
pickle.dump(d2, f)
pickle.dump(d3, f)

f.close()

f= open('testdill.dat', 'rb')

person2 = pickle.load(f)
d11 = pickle.load(f)
d21 = pickle.load(f)
d31 = pickle.load(f)

上面的代码将导致加载回 d11 对象时出现关键错误。我不知道 dill 包中是否有错误,或者我没有正确使用 dill。我感谢任何解决此问题的建议和意见。我在 64 位 Windows 7 上使用 Python 3.4。

谢谢,

约翰

4

1 回答 1

0

我是dill作者。看起来你发现了一个错误。dill如果您在github 页面上打开问题,我将不胜感激。

有一个解决方法,它是最后腌制结构化数组。为什么这行得通?嗯……我还不知道。(注意:代码在没有改变测试用例的情况下被简化)

import dill as pickle
import numpy as np

class testdill(object):
   def __init__(self, data):
       self.data =data

personType = [('name', 'a32'), ('age', '<i2')]  

person = np.zeros(2, dtype=personType, order='F')
d = np.random.randn(5)
d1 = testdill(d)

with open('testdill.dat', 'wb') as f:
  pickle.dump(d1, f)
  pickle.dump(person, f) 

with open('testdill.dat', 'rb') as f:
  d11 = pickle.load(f)
  person2 = pickle.load(f)

更新:这是一个dill现已修复的错误。您的代码适用于 GitHub 上的最新版本。

于 2016-09-07T21:36:59.987 回答