Python / Numpy / Scipy:用不同的lambda绘制泊松随机值

时间:2013-04-21 18:18:22

标签: python random numpy scipy poisson

我的问题是以最有效的方式提取每个具有不同均值/速率RV的N泊松随机值(Lam)。基本上是size(RV) == size(Lam)

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

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 个答案:

答案 0 :(得分:2)

虽然文档字符串没有记录此功能,但source表示可以将数组传递给numpy.random.poisson函数。

>>> 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返回1的离散倍数,并在lambda增长超过1时近似于钟形曲线。

>>> 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]