【问题标题】:Python/Numpy/Scipy: Draw Poisson random values with different lambdaPython/Numpy/Scipy:用不同的 lambda 绘制泊松随机值
【发布时间】:2013-04-14 14:47:02
【问题描述】:

我的问题是以最有效的方式提取 N 个泊松随机值 (RV),每个随机值具有不同的均值/比率 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

有没有可能改进?

【问题讨论】:

    标签: python random numpy scipy poisson


    【解决方案1】:

    虽然文档字符串没有记录此功能,但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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      相关资源
      最近更新 更多