在python/numpy中生成~10^9泊松随机数的最快方法

2024-04-20 03:33:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到在python/numpy中生成~10^9泊松随机数的最快方法,例如,假设我有一个形状(10002000)的平均泊松参数(在别处计算),我需要500个独立样本。这是我的代码中的一个瓶颈,需要几分钟才能完成。我尝试了三种方法,但我正在寻找更快的方法:

import numpy as np

# example parameters
nsamples = 500
nmeas = 2000
ninputs = 1000
lambdax = np.ones([ninputs, nmeas]) * 20

# numpy, one big array
sample0 = np.random.poisson(lam=lambdax, size=(nsamples, ninputs, nmeas))

# numpy, current version where other code happens in the loop
sample1 = np.zeros([nsamples, ninputs, nmeas])
for i in range(nsamples):
    sample1[i, :, :] = np.random.poisson(lam=lambdax)

# scipy
from scipy.stats import poisson
sample2 = poisson.rvs(lambdax, size=(nsamples, ninputs, nmeas))

结果:

sample0: 1 m 16 s
sample1: 1 m 20 s
sample2: 1 m 50 s

这里没有显示,我也通过multiprocessing并行化独立样本,但是对于如此大的参数,计算仍然非常昂贵。有更好的办法吗


Tags: 方法importnumpy参数nprandompoisson样本
1条回答
网友
1楼 · 发布于 2024-04-20 03:33:14

我一直站在你的立场上,以下是我的建议:

  • 对于较大的平均值,泊松效应类似于均匀分布。查看this post(如果您进行搜索,可能会更多)
  • ~1m运行时生成如此大量的随机数似乎是合理的。我不认为仅仅通过编码就可以超越sample0方法。现在取决于你想对随机数做什么,
    • 如果您的问题是多次重新运行程序,请尝试将sample0保存到文件中,并在下次运行时重新加载
    • 如果没有,我建议创建较少的随机数并重用它们。根据您的平均值,sample0中的许多随机数将在您的样本中重复。您可能希望创建较小的样本量并从中随机选择。例如,我会从sample0中选择一个随机数,并重复使用它,例如100次(因为该数字无论如何会在sample0中出现100次以上)

如果您提供更多关于您打算如何处理随机数的信息,我们可能会提供更多帮助。否则,在编码方面,我不确定您是否可以做得更进一步

相关问题 更多 >