用于从具有不同间隔的截断正态分布中采样的矢量化代码

Cup*_*tor 5 python random numpy scipy sampling

以下代码从具有不同间隔的trunctated正态分布生成大小为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
Run Code Online (Sandbox Code Playgroud)

Jai*_*ime 7

在不远的将来的某一天,所有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)
Run Code Online (Sandbox Code Playgroud)