2013-04-21 126 views
5

我的问题是以最有效的方式提取N个泊松随机值(RV),每个值有不同的平均值/速率Lam。基本上是size(RV) == size(Lam)Python/Numpy/Scipy:用不同的lambda绘制泊松随机值

这是一个天真的(很慢)的实现:

import numpy as NP 

def multi_rate_poisson(Lam): 
    rv = NP.zeros(NP.size(Lam)) 
    for i,lam in enumerate(Lam): 
     rv[i] = NP.random.poisson(lam=lam, size=1) 
    return rv 

也就是说,我的笔记本电脑,与1E6样品得出:

Lam = NP.random.rand(1e6) + 1 
timeit multi_poisson(Lam) 
1 loops, best of 3: 4.82 s per loop 

是否有可能从该改进?

回答

1

尽管文档字符串不会记录此功能,但source表示可以将数组传递给numpy.random.poisson函数。为lambda增长超过一个

>>> import numpy 
>>> # 1 dimension array of 1M random var's uniformly distributed between 1 and 2 
>>> numpyarray = numpy.random.rand(1e6) + 1 
>>> # pass to poisson 
>>> poissonarray = numpy.random.poisson(lam=numpyarray) 
>>> poissonarray 
array([4, 2, 3, ..., 1, 0, 0]) 

poisson random variable返回一个离散的倍数,和近似钟形曲线。

>>> import matplotlib.pyplot 
>>> count, bins, ignored = matplotlib.pyplot.hist(
      numpy.random.poisson(
        lam=numpy.random.rand(1e6) + 10), 
        14, normed=True) 
>>> matplotlib.pyplot.show() 

这种将数组传递到泊松生成器的方法看起来相当有效。

>>> timeit.Timer("numpy.random.poisson(lam=numpy.random.rand(1e6) + 1)", 
       'import numpy').repeat(3,1) 
[0.13525915145874023, 0.12136101722717285, 0.12127304077148438]