当前位置:  开发笔记 > 编程语言 > 正文

NumPy:将'np.save()'与'allow_pickle = False'一起使用的后果

如何解决《NumPy:将'np.save()'与'allow_pickle=False'一起使用的后果》经验,为你挑选了1个好方法。

根据这里的 NumPy文档,默认情况下会保存一个矩阵allow_pickle=True,此外,它们会告诉这个默认行为可能有什么问题:

allow_pickle:bool,optional
允许使用Python pickles 保存对象数组.禁止泡菜的原因包括安全性(加载腌制数据可以执行任意代码)和可移植性(腌制对象可能无法在不同的Python安装上加载,例如,如果存储的对象需要不可用的库,并且并非所有的pickle数据都兼容Python 2和Python 3).
默认值:True

阅读之后,我当然更愿意使用allow_pickle=False- 但是当它以这种方式使用时,它们并没有说明有什么不同.allow_pickel=True尽管存在缺点,但默认情况下必须使用某些理由.

你能否告诉我你是否使用allow_pickle=False它以及它的表现如何?



1> wildwilhelm..:

对象数组只是一个普通的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(这就是上面的可移植性意味着什么). 安全是另一个潜在的问题; 例如,您可以阅读一些关于如何在本文中滥用泡菜的内容.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有