我想从列表中抽取项目样本,但我想设置包含每个项目的概率,而不是要抽取的项目总数(因此 random.sample( )不起作用)。我通过以下代码得到了我想要的效果(其中 p 是包含概率,items 是事物列表):
[item for item in items if random.random() < p]
但是速度很慢。有什么加快速度的建议吗?
该列表最多有 1000 万个项目,并且是单一类型(都是整数),所以也许有一个 numpy/pandas 解决方案?
谢谢!
尼克
最佳答案
结果样本中的项目数量(n
次尝试,每个尝试的概率为 p
)具有二项式分布,因此可以快速随机生成,例如使用 numpy
:
sample_size = numpy.random.binomial(len(population). p)
现在,the_sample = random.sample(population,sample_size)
完全满足您的需求 - 相当于以相同的概率随机、独立地挑选总体中的每个项目p
.
这是基于你的示例代码,你说它太慢了,但也说它在其他方面还可以——即,对于总体中的每个项目都有相同的p
。如果每个项目都有一个完全不同的 p
,则这是行不通的(如果有几个不同的 p
值,它可以通过分层抽样来工作——将总体划分为统一的,每个子总体都有一个 p
值,并独立地从每个子总体中获取样本,然后将它们合并)。
关于python - 从 python 列表中快速、独立随机抽取/样本 - 固定概率,而不是总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28205593/