2013-04-21 6 views
5

Mein Problem ist es, auf die effizienteste Weise N Poisson Zufallswerte (RV) jeweils mit einem anderen Mittelwert/Rate Lam zu extrahieren. Grundsätzlich die size(RV) == size(Lam).Python/Numpy/Scipy: Zeichnen Poisson Zufallswerte mit verschiedenen Lambda

Hier ist es eine naive (sehr langsam) Umsetzung:

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 

Das, auf meinem Laptop, mit 1e6 Proben gibt:

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

Ist es möglich, von diesem zu verbessern?

Antwort

1

Obwohl die Docstrings diese Funktionalität nicht dokumentieren, gibt source an, dass es möglich ist, ein Array an die Funktion numpy.random.poisson zu übergeben.

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

Die poisson random variable kehrt diskreten Vielfache von eins, und nähert sich einer Glockenkurve als lambda jenseits man wächst.

Diese Methode der Übergabe des Arrays an den Poisson-Generator scheint recht effizient zu sein.

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