Почему np.arrays и списки работают с `allow_pickle = False`, а словари - нет? - PullRequest
1 голос
/ 04 мая 2020

Этот вопрос включает в себя 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 массивах или списках?

1 Ответ

3 голосов
/ 04 мая 2020

Насколько я понимаю, все словари, списки и numpy массивы Object arrays

Нет, это зависит от типа данных значений в списке. Причина, по которой вы сталкиваетесь с этой ошибкой, заключается в том, что вы пытаетесь создать numpy.array из dict объекта, который всегда будет давать «массив объектов», то есть numpy.array с dtype=object. См.

>>> import numpy as np
>>> np.array({'a': 4, 'b': 5})
array({'a': 4, 'b': 5}, dtype=object)

Принимая во внимание, что при использовании списка чисел (целых чисел, чисел с плавающей точкой, комплексных чисел и т. Д. c.) Для создания numpy.array этот массив будет иметь число dtype, которое здесь не требуется травление.

>>> np.array([1, 2, 3]).dtype
dtype('int64')

Вы можете загрузить словарь (или даже другие object s) из файла в numpy.array, , используя параметр allow_pickle , например

np.load('dictionary.npy', allow_pickle=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...