Numpy: default_rng.integers(2 ** 32)始终返回0

创建于 2020-04-24  ·  7评论  ·  资料来源: numpy/numpy

再现代码示例:

我不明白为什么default_rng.integers(2**32)总是返回0,而2**32-12**32+12**40等返回预期的随机数。 结果是numpy.int64 ,所以我希望能够生成最多2**64-1

$ python3.7 -c 'from numpy.random import default_rng; rng=default_rng(); print([rng.integers(2**32) for _ in range(5)])'
[0, 0, 0, 0, 0]

2**40没关系:

$ python3.7 -c 'from numpy.random import default_rng; rng=default_rng(); print([rng.integers(2**40) for _ in range(5)])'
[386296210341, 896689857600, 958588149890, 364800985883, 643738305251]

Numpy / Python版本信息:

我正在使用python3-3.7.6-2.fc31.x86_64和python3-numpy-1.17.4-2.fc31.x86_64运行Fedora 31:

vstinner@apu$ python3.7
Python 3.7.6 (default, Jan 30 2020, 09:44:41) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys, numpy; print(numpy.__version__, sys.version)
1.17.4 3.7.6 (default, Jan 30 2020, 09:44:41) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]
00 - Bug 06 - Regression numpy.random high

最有用的评论

问题也出在主人身上:

In [1]: import numpy as np

In [2]: np.__version__
Out[2]: '1.19.0.dev0+6d6df47'

In [3]: rng = np.random.default_rng()

In [4]: rng.integers(2**32, size=8)
Out[4]: array([0, 0, 0, 0, 0, 0, 0, 0])

这可能是在https://github.com/numpy/numpy/pull/14777中引入的

所有7条评论

可能它在后台使用32位生成器以提高速度,但随后将2**32 + 1强制转换为32bit! 它绝对是一个非常严重的错误。

问题也出在主人身上:

In [1]: import numpy as np

In [2]: np.__version__
Out[2]: '1.19.0.dev0+6d6df47'

In [3]: rng = np.random.default_rng()

In [4]: rng.integers(2**32, size=8)
Out[4]: array([0, 0, 0, 0, 0, 0, 0, 0])

这可能是在https://github.com/numpy/numpy/pull/14777中引入的

感谢@WarrenWeckesser ,问题也出现在1.17中,因此它可能比您的提交还要旧。 但是我确实认为到现在它已经深入到代码中了,您似乎知道这部分。 太好了,只是考虑对ping Kevin :)。

如果可以的话,我们应该尝试在1.18.4中包含此修复程序。

@ seberg ,gh- 反向移植到1.17。

原来原因是https://github.com/numpy/numpy/pull/14501 ,它已反向移植到1.17.3。 我正在修复。

建议的修复程序位于https://github.com/numpy/numpy/pull/16076

此页面是否有帮助?
0 / 5 - 0 等级