在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.]])
这就是问题,为什么它第二次返回零数组(而不是随机数)?
答案 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.random
或scipy.stats
中的一项功能。
描述numpy.empty
一个更好的词将是“未定义的”,这意味着用户不能对返回数组中最初的值做出任何假设。如果您知道无论如何都会覆盖其内容,empty
是创建数组的最便宜方式。电脑只会为你抢一些内存。如果该会话中尚未使用该内存,则可能会出现随机内存。但是你的电脑也会回收内存。
我不得不承认我真的不知道什么是再生记忆,但两种可能的可能性是
任何一种可能性都可以解释你所看到的。