结论
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。
2、ValueError: Object arrays cannot be loaded when allow_pickle=FalseValueError: Object arrays cannot be loaded when allow_pickle=Falsehttps://blog.csdn.net/huapiaoxiang21/article/details/89670464https://blog.csdn.net/huapiaoxiang21/article/details/89670464
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