目前更新到最新的numpy版本后,使用 numpy.load() 可能会报错:
ValueError: Object arrays cannot be loaded when allow_pickle=False
这是因为numpy版本不向下兼容所导致的,更新之前的numpy版本中(比如:1.16.1 或者 1.16.2版本)的load函数为:numpy.load(path),而更新后的load函数为:np.load(path, boolean)
,并且boolean (allow_pickle) 默认值为false。
所以报错:allow_pickle=False 。为此解决方法有多种,分别列出并作下对比:
方法一:
回退numpy的版本,可以解决这个问题:
pip uninstall numpy
pip install numpy==1.16.1
但是有童鞋就是不想回退版本,接着往下看。
方法二:
直接在numpy.load函数中设置allow_pickle=True:
datas = np.load('tang.npz', allow_pickle=True)
这样可以暂时解决问题,但不是长久之计,允许pickle可能会改变数组,保存之前和加载之后的.npz数组在试图使用numpy断言相等时会抛出异常。
看起来想简单的处理都不是好方法。
方法三:
这个方法比较神奇,相比与上面的方法还是更好一些:
# 在使用的时候创建一个副本,副本中allow_pickle=True
old = np.load
np.load = lambda *a,**k: old(*a,**k,allow_pickle=True)
datas = np.load('tang.npz')
# 使用完后重新换回来
np.load = old
del(old)
但是也会出现问题,就是运行一次没问题,第二次运行会报错:
TypeError: () got multiple values for keyword argument 'allow_pickle'
看起来还是没那么简单。所以再推荐一种解决办法。
方法四:
使用numpy.load函数之前先写一条代码设置值,之后再换回来:
np.load.__defaults__=(None, True, True, 'ASCII')
datas = np.load('tang.npz')
np.load.__defaults__=(None, False, True, 'ASCII')
到这里的话就是我查询到的全部解决方法,希望对大家有帮助。
下面是两条参考链接: