【问题标题】:Dill failed to load back numpy arrays after loading back numpy record arrays加载回 numpy 记录数组后,Dill 无法加载回 numpy 数组
【发布时间】:2016-09-07 15:48:56
【问题描述】:

全部:

我正在尝试使用 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。我感谢任何解决此问题的建议和 cmets。我在 64 位 Windows 7 上使用 Python 3.4。

谢谢,

约翰

【问题讨论】:

    标签: arrays python-3.x numpy dill


    【解决方案1】:

    我是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 上的最新版本。

    【讨论】:

    • 感谢您对解决方法的建议。我在这个简单的测试用例上进行了测试,如果我最后转储记录数组,它确实可以正常工作。但是在我的实际程序中,即使没有回溯消息,它也会导致我的程序崩溃。我需要对我的实际代码进行更多测试,因为它要复杂得多。
    • @JohnJiang:dill 内部没有太多的 hack,但其中之一是针对 numpy 数组的特殊情况。目前,如果您腌制 array 对象的不同集合,则有一些奇怪的情况会失败,但单独它们都腌制好。我没想到,所以没有测试用例。
    • 我测试了这个工作,即。在我的实际程序中保存其他与 numpy 相关的类。它仍然给我各种错误。有时它也能神奇地起作用。如果我们在同一个转储文件中混合 numpy 记录数组和常规数组,我认为索引 numpy 数组时出现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2020-01-30
    • 2013-04-21
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多