第二次运行np.empty

时间:2017-01-31 01:57:00

标签: python arrays numpy scipy ipython

在Scipy文件中写道:

  

函数零创建一个充满零的数组,函数创建一个充满1的数组,而函数empty创建一个数组,其初始内容是随机的,取决于内存的状态。默认情况下,创建的数组的dtype是float64。

所以我运行了这段代码:

import numpy as np
np.empty((1,2))

它的回归:

array([[  6.92892901e-310,   8.42664136e-317]])

所以它返回一个随机数字,所有的东西都很棒。

但是,当我第二次运行该代码时(在那个shell中),它返回一个零数组!

np.empty((1,2))
array([[ 0.,  0.]])

这就是问题,为什么它第二次返回零数组(而不是随机数)?

2 个答案:

答案 0 :(得分:3)

它不是随机的,它取决于当计算机为数组请求一些空间时,计算机给出的内存字节中保存的内容NumPy。如果那里有零以外的东西,那么这些将被解释为请求的dtype(看似随机但更好的单词将是不可预测的)。

在您的示例中,您没有保存第一个数组,因此第一个数组的内存立即被重用。

>>> import numpy as np
>>> print(id(np.empty((20))))
2545385324992
>>> print(id(np.empty((20))))
2545385324992

现在出现了令人惊奇的部分:似乎Python(或NumPy或你的操作系统)将内存归于NumPy 再次

如果你创建一个更大的数组而不是“零”,因为它是从其他地方获取的:

>>> print(np.empty((1, 2)))
[[  1.25757479e-311   1.25757479e-311]]
>>> print(np.empty((1, 3)))
[[  4.94065646e-324   9.88131292e-324   1.25757705e-311]]

答案 1 :(得分:2)

在这种情况下,文档的措辞似乎有点不幸。在适当的随机数生成器意义上,它们并不意味着随机。如果后者符合您的要求,您可以使用numpy.randomscipy.stats中的一项功能。

描述numpy.empty一个更好的词将是“未定义的”,这意味着用户不能对返回数组中最初的值做出任何假设。如果您知道无论如何都会覆盖其内容,empty是创建数组的最便宜方式。电脑只会为你抢一些内存。如果该会话中尚未使用该内存,则可能会出现随机内存。但是你的电脑也会回收内存。

我不得不承认我真的不知道什么是再生记忆,但两种可能的可能性是

  • 它包含了之前使用它的程序。
  • 或者操作系统出于安全原因用零覆盖了它

任何一种可能性都可以解释你所看到的。