python - 允许 64 位或更多位的 numpy.random.binomial 的替代方案?

标签 python python-3.x numpy random

我需要根据二项分布随机生成一系列数字。 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/

相关文章:

python - Python 3.7 中的断点()

python - 在 python 中访问第 n 个维度

python - (numpy) FFT 阵列的幅度错误(?)?

python - 如何修复 "AttributeError: ' JpegImageFile' 对象没有属性 'read' ?

python - 在 pythonanywhere 托管的应用程序中找不到文件

python - 尝试绘制迭代但 plt.plot 为空

python - 如何存储标记化的结果以供进一步索引?

python - 将图形嵌入 GUI(Qtdesigner 和 Pyside)

python - 在 Windows python 中安装 Openalpr

python - 有效地复制 numpy 数组