我需要根据二项分布随机生成一系列数字。 Numpy 的随机套件提供了一种方法来执行此操作,但不幸的是,它似乎仅限于处理 n 值的 32 位数字,我想使用该范围之外的值。 64 位应该足够了,尽管任意更高的精度也可以。
示例输出:
>>> np.random.binomial(1<<40, 0.5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mtrand.pyx", line 3506, in mtrand.RandomState.binomial (numpy\random\mtrand\mtrand.c:16555)
OverflowError: Python int too large to convert to C long
有没有我可以使用的替代方案?或者让 numpy 在此随机生成器内部使用 64 位数字的方法?
还是我需要自己准备好自己的车?
(正如 Robert Klein 所指出的,numpy 确实在除 Windows 之外的 64 位平台上执行 64 位操作;不幸的是我使用的是 Windows)。
最佳答案
在 C long
整数为 64 位的机器上,numpy.random.binomial()
将接受并生成 64 位整数。大多数 64 位平台(Windows 除外)都是这样。例如,在我的 64 位 OS X 机器上:
[~]
|11> np.random.binomial(1 << 40, 0.5)
549755265539
[~]
|12> np.random.binomial(1 << 40, 0.5) > (1<<32)
True
或者,如果您卡在 Windows 上,请考虑使用 Normal Approximation到二项分布。在如此大的 n
下,近似值应该非常好。
def approx_binomial(n, p, size=None):
gaussian = np.random.normal(n*p, sqrt(n*p*(1-p)), size=size)
# Add the continuity correction to sample at the midpoint of each integral bin.
gaussian += 0.5
if size is not None:
binomial = gaussian.astype(np.int64)
else:
# scalar
binomial = int(gaussian)
return binomial
关于python - 允许 64 位或更多位的 numpy.random.binomial 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23766009/