此问题涉及np.save
和np.load
最佳实践。由于较新的numpy版本1.16.3,np.load
中的默认值设置为allow_pickle=False
。
保存列表后,进一步的加载声明与默认的allow_pickle=False
:配合得很好
>> x = [0, 1, 2]
>> np.save('my_x_list.npy', x)
>> loaded_x = np.load('my_x_list.npy')
>> loaded_x
Out: array([0, 1, 2])
numpy数组也是如此:
>> y = np.arange(10)
>> np.save('my_y_numpy_array.npy', y)
>> loaded_y = np.load('my_y_numpy_array.npy')
>> loaded_y
Out: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
然而,字典会产生这样的错误:
>> mydict = {'a': 4, 'b': 5}
>> np.save('my_dict.npy', mydict)
>> loaded_z = np.load('my_z_dict.npy')
ValueError: Object arrays cannot be loaded when allow_pickle=False
据我所知,字典、列表和numpy数组都是Object arrays
。因此,预计numpy数组或列表也会引发此错误。为什么这个错误是由字典引发的,而不是由numpy数组或列表引发的?
据我所知,字典、列表和
numpy
数组都是Object arrays
否,这取决于列表中值的数据类型。您遇到此错误的原因是,您正试图从dict
对象创建numpy.array
,该对象将始终给出一个"对象数组",也就是说,一个具有dtype=object
的numpy.array
。参见
>>> import numpy as np
>>> np.array({'a': 4, 'b': 5})
array({'a': 4, 'b': 5}, dtype=object)
然而,当使用数字列表(整数、浮点数、复数等(创建numpy.array
时,该数组将具有数字dtype
,不需要在此处进行pickle。
>>> np.array([1, 2, 3]).dtype
dtype('int64')
可以使用allow_pickle
参数将字典(甚至其他object
(从文件加载到numpy.array
中,例如
np.load('dictionary.npy', allow_pickle=True)