ValueError: Object arrays cannot be loaded when allow_pickle=False【Numpy读取字典文件报错】

结论

        np.save()和np.load()函数都应该加上参数 allow_pickle=True,如:

np.save('outfile.npy', parameters, allow_pickle=True)

a = np.load('outfile.npy', allow_pickle=True)

原因分析

        在 Numpy 1.16.2 之后保存和读取字典时,需要加上allow_pickle=True,但是不同目前网络上普遍说的,仅仅在np.save()中加入此参数,但同时也应该在np.load()中也加入此参数。

        因为np.load()的函数定义时,allow_pickle是默认为False的,这导致无论np.save()时有没有指定为True,最终都为False从而报错。

# np.load()源码,节选自 venv/Lib/site-packages/numpy/lib/npyio.py
@set_module('numpy')
def load(file, mmap_mode=None, allow_pickle=False, fix_imports=True,
         encoding='ASCII'):
    pass


#Read an array from an NPY file.
def read_array(fp, allow_pickle=False, pickle_kwargs=None):
    # ......
    # Now read the actual data.
    if dtype.hasobject:
        # The array contained Python objects. We need to unpickle the data.
        if not allow_pickle:
            raise ValueError("Object arrays cannot be loaded when "
                             "allow_pickle=False")
    # ......

        此外也可以将Numpy的版本调整为1.16.1,在此版本中allow_pickle默认为True。

pip install numpy==1.16.1

参考文献

1、Numpy.load() 官方文档 

numpy.load — NumPy v1.21 Manualhttps://numpy.org/doc/stable/reference/generated/numpy.load.html

        警告

        当加载包含对象数组的文件时将使用pickle模块,该模块遇到错误或恶意构造的数据时是不安全的。考虑传递allow_pickle=False加载已知不包含对象数组的数据,以便更安全地处理不受信任的来源。默认值:Fasle。1.16.3版中更改:响应 CVE-2019-6446,将默认设置为 False。

 3、How to fix 'Object arrays cannot be loaded when allow_pickle=False' for imdb.load_data() function?How to fix 'Object arrays cannot be loaded when allow_pickle=False' for imdb.load_data() function?https://stackoverflow.com/questions/55890813/how-to-fix-object-arrays-cannot-be-loaded-when-allow-pickle-false-for-imdb-loa

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值