【问题标题】:Fastest way to sample sequences from a non-uniform distribution in numpy从 numpy 中的非均匀分布中采样序列的最快方法
【发布时间】:2014-07-26 12:13:49
【问题描述】:

我想生成一个由两个元素组成的序列的非均匀随机样本,由 numpy.choice() 生成

例如我有元素 e=[0,1,2,3,4] 的比例 p=[0.1, 0, 0.3, 0.6, 0] (元素在这里由索引标识) 我想要从这些比例中提取的两个元素的 3 个序列的样本: [03,23,32]

在这里,我们首先通过对索引为 0 的元素进行采样(代表总元素的 10%)来绘制 0,然后通过对索引为 3 的元素(代表 60% 的元素)进行采样来绘制 3:这两个元素一起产生序列'03'

【问题讨论】:

    标签: python-2.7 numpy random-sample


    【解决方案1】:

    如果你能找到一个整数N,那么对于p中的每个元素xx*N都是一个整数,那么你可以:

    p=[0.1, 0, 0.3, 0.6, 0] 
    N = 10
    
    nums = []
    for i, x in enumerate(p):
        nums.extend([i] * int(x*N))
    
    
    import random
    random.choice(nums)
    

    如果N很大,那么可以对比例求和,用bisect搜索0到1之间的随机数:

    cp = []
    s = 0
    for x in p:
        s += x
        cp.append(s)
    
    import bisect
    [bisect.bisect_left(cp, random.random()) for i in range(10)]
    

    如果你使用 numpy:

    import numpy as np
    
    cp = np.cumsum(p)
    np.searchsorted(cp, np.random.rand(10))
    

    或:

    np.random.choice(range(5), 10, p=p)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-29
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      相关资源
      最近更新 更多