2014-02-26 7 views
5

Der folgende Code generiert eine Stichprobe der Größe 100 aus trunkierten Normalverteilungen mit unterschiedlichen Intervallen. Gibt es eine effektive (vektorisierte) Art, dies zu tun?Vektorisierter Code für Stichproben aus verkürzten Normalverteilungen mit unterschiedlichen Intervallen

from scipy.stats import truncnorm 
import numpy as np 
sample=[] 
a_s=np.random.uniform(0,1,size=100) 
b_s=a_s+0.2 
for i in range(100): 
    sample.append(truncnorm.rvs(a_s[i], b_s[i], size=100)) 
print sample 
+0

Diese Frage Wegthema zu sein scheint, weil es auf http://codereview.stackexchange.com gehört – jonrsharpe

+4

@jonrsharpe - ich nicht zustimmen. Wenn dies nicht der Fall ist, sollten 99% aller "numpy", "scipy", usw. Fragen auf der Codereview stehen. –

Antwort

6

Eines Tages in der nicht allzu fernen Zukunft alle NumPy/SciPy Funktionen werden alle Argumente übertragen, und Sie werden in der Lage sein truncnorm.rvs(a_s, b_s, size=100) zu tun, aber da wir noch nicht da sind, können Sie manuell Ihre zufällige generieren Proben von einer gleichmäßigen Verteilung und der CDF und PPF einer Normalverteilung:

import numpy as np 
from scipy.stats import truncnorm, norm 

a_s = np.random.uniform(0, 1, size=100) 
b_s = a_s + 0.2 

cdf_start = norm.cdf(a_s) 
cdf_stop = norm.cdf(b_s) 
cdf_samples = np.random.uniform(0, 1, size=(100, 100)) 
cdf_samples *= (cdf_stop - cdf_start)[:, None] 
cdf_samples += cdf_start[:, None] 
truncnorm_samples = norm.ppf(cdf_samples) 
+1

Ich träume von diesem Tag: D – Cupitor

Verwandte Themen