NumPy: последствия использования ' np.save () 'with' allow pickle=False'
согласно документации NumPy здесь по умолчанию, матрица сохраняется с allow_pickle=True
, и, кроме того, они говорят, что может быть проблематичным с этим поведением по умолчанию:
allow_pickle : bool, необязательно
Разрешить сохранение массивов объектов с помощью Python pickles. Причины запрета солений включают в себя безопасность (загрузка маринованных данных может выполнять произвольный код) и переносимость (маринованные объекты могут не загружаться на разных установках Python, например, если хранимым объектам требуются библиотеки, которые недоступны, и не все маринованные данные совместимы между Python 2 и Python 3).
По Умолчанию: True
после прочтения я, конечно, предпочел бы использовать allow_pickle=False
- но они не говорят, что отличается, когда он используется таким образом. Должна быть какая-то причина, по которой они используют allow_pickel=True
по умолчанию, несмотря на его недостатки.
не могли бы вы сказать, используете ли вы allow_pickle=False
и как он себя ведет по-другому?
1 ответов
массив объектов - это обычный массив numpy, где dtype
is object
; это происходит, если содержимое массива не имеет нормальных числовых типов (например,int
или float
, etc.). Мы можем попробовать сохранить массив NumPy с объектами, просто чтобы проверить, как это работает. Простой вид объекта был бы dict
:
>>> import numpy as np
>>> a = np.array([{x: 1} for x in range(4)])
>>> a
array([{0: 1}, {1: 1}, {2: 1}, {3: 1}], dtype=object)
>>> np.save('test.pkl', a)
загрузка этого назад отлично работает:
>>> np.load('test.pkl.npy')
array([{0: 1}, {1: 1}, {2: 1}, {3: 1}], dtype=object)
массив может быть сохранен без использования рассола, хотя:
>>> np.save('test.pkl', a, allow_pickle=False)
...
ValueError: Object arrays cannot be saved when allow_pickle=False
в эмпирическое правило для солений заключается в том, что вы в безопасности, если вы загружаете соленья, которые вы сделали, но вы должны быть осторожны с загрузкой солений, которые вы получили откуда-то еще. Во-первых, если у вас не установлены те же библиотеки (или версии библиотек), которые использовались для создания рассола, вы не сможете загрузить рассол (это то, что подразумевается под мобильность выше). безопасность другая потенциальная забота; вы можете прочитать немного о том, как соленья могут быть злоупотребляли в в этой статье, например.