为什么np.arrays和list可以使用`allow_pickle=False`,而字典却不能



此问题涉及np.savenp.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=objectnumpy.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)

相关内容

最新更新