2014-02-26 18 views
5

以下代碼根據具有不同間隔的非簡化正態分佈生成大小爲100的樣本。有沒有任何有效的(矢量化)方式來做到這一點?用於採用不同間隔的截短正態分佈進行採樣的矢量化代碼

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

這個問題似乎是題外話,因爲它屬於上http://codereview.stackexchange.com – jonrsharpe

+4

@jonrsharpe - 我不同意。如果這是題外話,所有'numpy','scipy'等問題中的99%應該在codereview上。 –

回答

6

有一天,在不遠的將來,所有與NumPy/SciPy的功能將播出所有的參數,你就可以做truncnorm.rvs(a_s, b_s, size=100),但由於我們現在還沒有,你可以手動生成隨機從均勻分佈和正態分佈的CDF和PPF樣本:

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

我夢想那一天:D – Cupitor