使用 ‘np.save()’ 中的 ‘allow_pickle=False’ 参数的后果

使用 ‘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数组,如下所示:

import numpy as np

arr = np.array([1, 2, 3])
Python

您可以将该数组保存到磁盘上,如下所示:

np.save('arr.npy', arr)
Python

该数组已成功保存到名为 ‘arr.npy’ 的文件中。我们可以使用 ‘np.load()’ 函数将该数组加载回来,并验证代码。

arr = np.load('arr.npy')
print(arr)
Python

输出结果应该如下所示:

[1 2 3]
Python

现在,让我们假设您尝试将一个具有多项式系数的NumPy数组保存到磁盘上,如下所示:

arr = np.array([1, 2, 3], dtype=np.polynomial.Polynomial)
np.save('arr.npy', arr)
Python

如果您尝试将其数据类型设置为 ‘np.polynomial.Polynomial’ 并使用 ‘np.save()’ 函数将其保存到磁盘上,您将会出现以下错误:

TypeError: can't pickle numpy.polynomial.polynomial.Polynomial objects
Python

这就是 ‘allow_pickle=False’ 意味着的影响。您会看到,如果您尝试对一个不支持pickle序列化的NumPy对象进行pickle操作,将会导致TypeError的异常。

启用 ‘allow_pickle=True’

当您使用 ‘allow_pickle=True’ 时,您将允许对数组进行pickle序列化。显然,如果您不知道pickle是什么,或者不知道您正在pickle什么,那么您将有可能让一个恶意对象执行。

现在,让我们再次运行上面的示例,但是这次我们将 ‘allow_pickle’ 设置为True。

arr = np.array([1, 2, 3], dtype=np.polynomial.Polynomial)
np.save('arr.npy', arr, allow_pickle=True)
Python

现在,我们可以使用 ‘np.load()’ 函数将数组加载回来,并验证代码。

arr = np.load('arr.npy')
print(arr)
Python

输出结果应该如下所示:

[Polynomial([1., 2., 3.], domain=[-1,  1], window=[-1,  1])]
Python

您会注意到,当 ‘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时能够确保数据的安全性。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册