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

问题描述 投票:0回答:1

我想找到最快的方法来在python / numpy中生成〜10 ^ 9个泊松随​​机数-例如,假设我有一个形状为(1000,2000)的平均泊松参数(在其他地方计算),我需要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并行化独立样本,但是对于如此大的参数,计算仍然非常昂贵。有更好的方法吗?

python numpy random poisson
1个回答
0
投票

我去过你的鞋子,这是我的建议:

  • 对于较大的平均值,泊松的作用类似于均匀。签出this post(如果您搜索的话,可能还会更多)。
  • 〜1m运行时似乎可以生成如此大量的随机数。我不认为仅通过编码就可以将sample0方法放在首位。现在,根据您要对随机数执行的操作,
    • 如果您的问题要多次重新运行程序,请尝试将sample0保存到文件中,并在下次运行时重新加载。
    • 如果没有,我建议创建较少数量的随机数并重新使用它们。根据您的平均值,sample0中的许多随机数将在您的样本中重复出现。您可能想要创建较小的样本大小并从中随机选择。例如,我会从sample0中选择一个随机数,然后将其重复使用,例如100次(因为该数字无论如何都会在sample0中出现超过100次)。

如果您提供有关您打算如何处理随机数的更多信息,我们可能会提供更多帮助。否则,我不确定是否可以做得更多。

© www.soinside.com 2019 - 2024. All rights reserved.