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

в эмпирическое правило для солений заключается в том, что вы в безопасности, если вы загружаете соленья, которые вы сделали, но вы должны быть осторожны с загрузкой солений, которые вы получили откуда-то еще. Во-первых, если у вас не установлены те же библиотеки (или версии библиотек), которые использовались для создания рассола, вы не сможете загрузить рассол (это то, что подразумевается под мобильность выше). безопасность другая потенциальная забота; вы можете прочитать немного о том, как соленья могут быть злоупотребляли в в этой статье, например.