【问题标题】:Error when saving with numpy.save and loading with pickle.load使用 numpy.save 保存和使用 pickle.load 加载时出错
【发布时间】:2020-07-03 14:02:26
【问题描述】:

我保存了一个简单的 numpy 数组:

numpy.save(filepath, anarray)

我现在正尝试使用 pickle 检索它(我不想切换到 numpy.load,因为代码必须灵活),但我得到:

atuple = pickle.load(open(filepath, 'rb'))

_pickle.UnpicklingError: STACK_GLOBAL requires str

【问题讨论】:

    标签: python numpy pickle


    【解决方案1】:

    Numpy 和 pickle 使用不同的文件格式。没有理由期望您应该能够解开使用np.save 保存的数组。如果你需要能够用 pickle 加载东西,你应该用 pickle 保存它们。

    【讨论】:

    • 为什么 numpy.save 有一个默认的 True allow_pickle 选项呢?此外,numpy.load 明确表示“从 .npy、.npz 或 pickled 文件 加载数组或 pickled 对象”。这是否意味着当用泡菜倾倒时,可以用 numpy 检索但不能相反?
    • 如果数组包含objects,它可以使用pickle 序列化(和检索)它们。相反,数组的pickle 使用save 对其进行序列化。所以它们是相关的。但这并不意味着文件完全兼容。
    • @hpaulj 我不知道pickle 使用save 作为其实现的一部分。这很酷!不过,我认为这并不意味着兼容性很重要。您可以将 CSV 保存在 JSON 对象中,但这并不意味着您可以使用 CSV 阅读器加载它。
    • @duff18 allow_pickle 选项与是否允许保存或加载带有 python 对象元素的数组有关(而不是例如 numpy 数字类型)。 Unpickling 可以执行任意和潜在的恶意代码。 allow_pickle=False 是一种防范措施,而不是 pickle 兼容性设置。
    猜你喜欢
    • 2016-06-15
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2011-09-20
    相关资源
    最近更新 更多