使用 ‘np.save()’ 中的 ‘allow_pickle=False’ 参数的后果
在本文中,我们将介绍使用NumPy库中的 ‘np.save()’ 函数并使用 ‘allow_pickle=False’ 参数的后果。当使用 ‘np.save()’ 保存一个NumPy数组时,我们可以选择是否允许对数组进行pickle序列化。
pickle是Python的一种序列化工具,它可以将Python对象转化为二进制形式,并在需要的时候将其恢复为原来的形式。然而,pickle并不是完全安全的,因为它可以通过Python自己的操作系统调用来执行任意代码。这就意味着,如果您接受并打开了一个带有恶意对象的pickle并将其反序列化,那么恶意对象就会得到执行。
因此,为了确保安全,NumPy默认情况下不允许数组进行pickle序列化。但是,如果您非常清楚自己在做什么,也可以选择允许pickle。
阅读更多:Numpy 教程
‘allow_pickle=False’ 的影响
当您使用 ‘np.save()’ 函数时,默认情况下 ‘allow_pickle’ 参数被设置为False,这意味着会禁止对数组进行pickle序列化。如果您想要允许pickle,需要将 ‘allow_pickle’ 参数设置为True。
现在让我们看一下使用 ‘allow_pickle=False’ 的示例。假设您有一个NumPy数组,如下所示:
您可以将该数组保存到磁盘上,如下所示:
该数组已成功保存到名为 ‘arr.npy’ 的文件中。我们可以使用 ‘np.load()’ 函数将该数组加载回来,并验证代码。
输出结果应该如下所示:
现在,让我们假设您尝试将一个具有多项式系数的NumPy数组保存到磁盘上,如下所示:
如果您尝试将其数据类型设置为 ‘np.polynomial.Polynomial’ 并使用 ‘np.save()’ 函数将其保存到磁盘上,您将会出现以下错误:
这就是 ‘allow_pickle=False’ 意味着的影响。您会看到,如果您尝试对一个不支持pickle序列化的NumPy对象进行pickle操作,将会导致TypeError的异常。
启用 ‘allow_pickle=True’
当您使用 ‘allow_pickle=True’ 时,您将允许对数组进行pickle序列化。显然,如果您不知道pickle是什么,或者不知道您正在pickle什么,那么您将有可能让一个恶意对象执行。
现在,让我们再次运行上面的示例,但是这次我们将 ‘allow_pickle’ 设置为True。
现在,我们可以使用 ‘np.load()’ 函数将数组加载回来,并验证代码。
输出结果应该如下所示:
您会注意到,当 ‘allow_pickle=True’ 时,该数组现在可以pickle序列化。
总结
在本文中,我们介绍了NumPy的 ‘np.save()’ 函数,并探讨了在使用 ‘allow_pickle=False’ 参数时的后果。如果您将 ‘allow_pickle’ 参数设置为False,则禁止对数组进行pickle序列化,这可以确保安全性。但如果您非常清楚自己在做什么,也可以设置 ‘allow_pickle=True’,允许对数组进行pickle序列化。
需要特别注意的是,如果您对一个不支持pickle序列化的NumPy对象进行pickle操作,将会导致TypeError的异常。因此,建议您在使用 ‘np.save()’ 函数时,仔细考虑是否需要允许pickle,以及您正在pickle的对象是否支持pickle序列化。
最后,我们还展示了一个具体的示例,让您更好地了解了在使用 ‘allow_pickle’ 参数时的影响和行为。
希望本文能够帮助您更好地理解 ‘np.save()’ 函数以及 ‘allow_pickle’ 参数的使用,也希望您在使用NumPy时能够确保数据的安全性。