2013-04-21 5 views
5

के साथ पोइसन यादृच्छिक मूल्यों को आकर्षित करें मेरी समस्या एन पोइसन यादृच्छिक मूल्यों (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 

यह इस से सुधार करने के लिए संभव है?

उत्तर

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 रिटर्न एक असतत गुणकों, और एक घंटी वक्र का अनुमान लगाती है लैम्ब्डा के रूप में एक से परे होती है।

>>> 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] 
संबंधित मुद्दे