我正在尝试使用Numpy生成整数和浮点数的随机64位整数值,在该类型的整个有效值范围内。要生成随机32位浮点数,我可以使用:
In [2]: np.random.uniform(low=np.finfo(np.float32).min,high=np.finfo(np.float32).max,size=10)
Out[2]:
array([ 1.47351436e+37, 9.93620693e+37, 2.22893053e+38,
-3.33828977e+38, 1.08247781e+37, -8.37481260e+37,
2.64176554e+38, -2.72207226e+37, 2.54790459e+38,
-2.47883866e+38])
但如果我尝试将其用于64位数字,我会得到
In [3]: np.random.uniform(low=np.finfo(np.float64).min,high=np.finfo(np.float64).max,size=10)
Out[3]: array([ Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf, Inf])
类似地,对于整数,我可以成功生成随机32位整数:
In [4]: np.random.random_integers(np.iinfo(np.int32).min,high=np.iinfo(np.int32).max,size=10)
Out[4]:
array([-1506183689, 662982379, -1616890435, -1519456789, 1489753527,
-604311122, 2034533014, 449680073, -444302414, -1924170329])
但64位整数不成功:
In [5]: np.random.random_integers(np.iinfo(np.int64).min,high=np.iinfo(np.int64).max,size=10)
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
/Users/tom/tmp/<ipython console> in <module>()
/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.random_integers (numpy/random/mtrand/mtrand.c:6640)()
/Library/Python/2.6/site-packages/numpy/random/mtrand.so in mtrand.RandomState.randint (numpy/random/mtrand/mtrand.c:5813)()
OverflowError: long int too large to convert to int
这是预期的行为,还是我应该将这些行为报告为Numpy中的错误?
答案 0 :(得分:7)
对于整数,您可以生成2个32位随机数并将它们组合起来:
a + (b << 32)
答案 1 :(得分:2)
numpy.random.uniform()
的代码似乎在某个时刻进行了高低计算,而Inf则源自那里。
如图所示,易于生成均匀分布的整数。均匀分布的浮点数需要更加仔细的思考。
至于将这些奇怪的事情报告为错误,我认为您应该这样做或将消息发布到项目邮件列表。这样你至少可以找出开发人员认为合理的行为。
答案 2 :(得分:0)
问题似乎是random_numbers
方法只需要32位整数。
根据ticket #555随机种子现在可以是版本1.1.0的64位我建议从here下载并安装最新版本的NumPy。
答案 3 :(得分:0)
我不相信它是指随机种子调用。我得到的最简单的代码是“Python int太大而无法转换为C long”:
x = numpy.random.random_integers(2**64,size=(SIZE,)).astype(numpy.uint64)
numpy。版本 = 1.5.0这里
答案 4 :(得分:0)
我意识到这是一个非常古老的问题,但在Python 3.6.3
中有一个新答案:
Python 3.6.3 |Anaconda, Inc.| (default, Oct 6 2017, 12:04:38)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> import sys
>>> sys.maxsize
9223372036854775807
>>> np.random.randint(sys.maxsize)
8550528944245072046