创建具有可变标准偏差限制的法线

Creating a normal with limits with variable standard deviation

所以我研究了 np.random.norm() 函数,我理解了 mean 和 std。我想要做的是选择两个数字作为限制,例如 1.0 的平均值,我希望数字保持在 0.5 和 1.5 之间。我知道法线在技术上会双向无穷大,所以我需要放置 if 语句来控制它。我真正想要的是以编程方式调整标准偏差,将任何低于 0.5 的值置于第 10 个百分位数中,将任何高于 1.5 的值置于第 90% 的百分位数中(不一定是 90,但我希望我的观点清楚)。有人可以在这里指导我正确的方向吗?

谢谢!

numpy 数组有一个 .clip() 方法,听起来有点像你想要的:

In [4]: np.random.normal(1,.5,20).clip(0.5, 1.5)
Out[4]:
array([ 1.5       ,  1.07224695,  1.13982969,  1.5       ,  0.5       ,
        1.11223533,  0.96127858,  1.5       ,  0.632036  ,  1.23016015,
        0.5       ,  1.22120972,  0.66288919,  0.83533509,  0.90682758,
        1.13052954,  1.30401167,  1.43251102,  0.60045975,  0.9030919 ])

如果你想动态地完成某个百分位数,你可以存储数组并计算百分位数:

In [9]: a = np.random.normal(1,.5,20)

In [10]: np.percentile(a, (10, 90))
Out[10]: array([ 0.56384585,  1.68703272])

In [11]: a.clip(*np.percentile(a, (10,90)))
Out[11]:
array([ 1.25908523,  1.58094023,  1.28567188,  0.56384585,  0.74706497,
        1.31853202,  1.47917016,  1.68703272,  0.62015172,  1.18379091,
        1.2165656 ,  1.30725614,  0.64338962,  1.66354559,  0.5804302 ,
        1.68703272,  1.59532039,  0.56384585,  1.21919715,  1.65989337])