python - 从 python 列表中快速、独立随机抽取/样本 - 固定概率,而不是总数

标签 python numpy pandas random

我想从列表中抽取项目样本,但我想设置包含每个项目的概率,而不是要抽取的项目总数(因此 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/

相关文章:

python Pandas 数据框: need speed up process related to calculate 3 rows data

python - 如何从 Tkinter Text Widget 获取输入?

python - 快速创建 2 个大型随机矩阵并将它们相乘

python - 如何在热图上正确显示多条件数据集?

python - 在 Pandas 中用 Groupby 减去两列

python - Pandas Dataframe 中 bool 值的条件前向填充

python - 使用 Python 替换 CSV 文件中的分隔符

python - 如何获取wxPython中CreateButtonSizer(或CreateSeparatedButtonSizer)创建的按钮对象

python - 在数组中操作 Numpy 数组的快速方法

python - Matplotlib 在所有子图上显示 x-ticks 和唯一的 y 标签