第二次运行np.empty

5 python arrays numpy ipython scipy

在Scipy文件中写道:

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

所以我运行了这段代码:

import numpy as np
np.empty((1,2))
Run Code Online (Sandbox Code Playgroud)

它回归:

array([[  6.92892901e-310,   8.42664136e-317]])
Run Code Online (Sandbox Code Playgroud)

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

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

np.empty((1,2))
array([[ 0.,  0.]])
Run Code Online (Sandbox Code Playgroud)

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

MSe*_*ert 6

NumPy它不是随机的,它取决于计算机在为数组请求一些空间时提供的内存字节中保存的内容。如果其中有除零之外的其他内容,那么这些内容将使用请求的 dtype 进行解释(看似随机,但更好的词将是不可预测的)。

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

>>> import numpy as np
>>> print(id(np.empty((20))))
2545385324992
>>> print(id(np.empty((20))))
2545385324992
Run Code Online (Sandbox Code Playgroud)

现在令人惊奇的部分来了: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]]
Run Code Online (Sandbox Code Playgroud)