gpt4 book ai didi

python - NumPy:使用 'np.save()' 和 'allow_pickle=False' 的后果

转载 作者:太空狗 更新时间:2023-10-29 18:06:26 27 4
gpt4 key购买 nike

根据 NumPy 文档 here ,默认情况下,矩阵使用 allow_pickle=True 保存,此外,它们还指出了此默认行为可能存在的问题:

allow_pickle : bool, optional
Allow saving object arrays using Python pickles. Reasons for disallowing pickles include security (loading pickled data can execute arbitrary code) and portability (pickled objects may not be loadable on different Python installations, for example if the stored objects require libraries that are not available, and not all pickled data is compatible between Python 2 and Python 3).
Default: True

阅读之后,我当然更愿意使用 allow_pickle=False - 但他们并没有说出以这种方式使用时有什么不同。尽管有缺点,但他们默认使用 allow_pickel=True 肯定有一些原因。

请问您是否使用了 allow_pickle=False 以及它的行为有何不同?

最佳答案

对象数组只是一个普通的 numpy 数组,其中 dtypeobject;如果数组的内容不是普通数值类型(如 intfloat 等),就会发生这种情况。我们可以尝试用对象保存一个 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)

不过,如果不使用 pickle 就无法保存数组:

>>> np.save('test.pkl', a, allow_pickle=False)
...
ValueError: Object arrays cannot be saved when allow_pickle=False

泡菜的经验法则是,如果您加载的是自己制作的泡菜,那么您是安全的,但您应该小心加载从其他地方获得的泡菜。一方面,如果您没有安装用于制作 pickle 的相同库(或库版本),您可能无法加载 pickle(这就是可移植性的含义以上)。 安全是另一个潜在的问题;您可以在 this article 中了解泡菜是如何被滥用的。 ,例如。

关于python - NumPy:使用 'np.save()' 和 'allow_pickle=False' 的后果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41696360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com