【问题标题】:Restricting numpy.random.lognormal to a given range, Python将 numpy.random.lognormal 限制在给定范围内,Python
【发布时间】:2018-08-23 23:18:39
【问题描述】:

我正在尝试使用适合年龄数据集的对数正态分布对随机数进行采样。

Age_abscess = numpy.random.lognormal(mean=numpy.log(29.9090909),
              sigma=numpy.log(11.6574484),size=None)

我有时会得到 ^23 且小于 1 的曲调的答案。鉴于我希望这些是年龄,有没有办法将平局限制在 0 到 100 之间?

编辑:经过一番头脑风暴后,我想出了:

def lognormal(mean,sigma):
    age = numpy.random.lognormal(mean=numpy.log(mean),sigma=numpy.log(sigma),size=None)
    if 0>= age <= 100:
    age=age
return age

但是,这只会运行一次,所以我必须弄清楚如何循环它直到它满足条件。之前可能有人问过这个问题——如果我找到答案会更新。

【问题讨论】:

  • 条件句中有缩进错误

标签: python numpy random


【解决方案1】:
def lognormal(mean,sigma):
    while True:
        age = np.random.lognormal(mean=np.log(mean),sigma=np.log(sigma),size=None)
        if age >= 0 and age <= 100:
            break
    return age

接受的答案应该不起作用。可能我很困惑

【讨论】:

    【解决方案2】:

    您似乎正在寻找截断的对数正态分布。 Numpy 没有,但您可以找到其他自定义实现,例如 this one

    如果您的年龄条件不满足,您的另一个选择是丢弃您的绘图并重复它!

    编辑:如果您想删除不需要的值,只需将代码中的 for 替换为 while:

    编辑 2:正如 kevinkayaks 指出的那样,您需要创建一个无限循环并在满足您的条件后中断!

    def lognormal(mean,sigma):
        while True:
            age = numpy.random.lognormal(mean=numpy.log(mean),sigma=numpy.log(sigma),size=None)
            if age>=0 and age <= 100:
                break
        return age
    

    【讨论】:

    • 谢谢!您对我如何实现丢弃抽奖消息有什么建议吗?
    • 看看我更新的答案!只需要用 while 替换 for :)
    【解决方案3】:

    以上答案仅适用于单个值。如果您想要该范围内的值向量,您可以无限循环,直到获得一系列神奇地适合您的范围的值,或者您可以通过从基本分布中重新绘制样本来替换范围之外的值(替换例外)。

    i = 0
    while True:
       # for first iteration, make an initial vector of random values
       if i == 0:
           V = np.round(np.random.lognormal(mu, sigma, 1000),2)
    
       #Make binary vectors for those values that are out of range and in range
       V_outRange = (V > 100) + 0.
       V_good = (V < 100) + 0.
    
       #keep the values in range
       V_ok = np.multiply(V, V_good)
    
       #Resample values that are out of range
       V_next = np.round(np.multiply(V_outRange, np.random.lognormal(mu, sigma, 1000)),2)
    
       #Re-combine previous in-range values with newly sampled values
       V = V_ok + V_next
    
       #check to see if all values are in range, if not re-loop
       if (np.count_nonzero(V > 100)) == 0:
           break
    
       i += 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多