如何在Python中进行加权随机抽样类别

30 投票
9 回答
12851 浏览
提问于 2025-04-16 20:02

给定一个包含多个元组的列表,每个元组里有一个概率和一个物品,我想根据这个概率来随机选择一个物品。例如,给定列表 [ (.3, 'a'), (.4, 'b'), (.3, 'c')],我希望能有 40% 的机会选择到 'b'。

在 Python 中,有什么标准的方法可以做到这一点呢?

我查过随机模块,但似乎没有合适的函数;还有 numpy.random,虽然它有一个多项式函数,但结果看起来不太适合这个问题。我基本上是在寻找类似于 Matlab 中的 mnrnd 的东西。

非常感谢。

谢谢大家这么快就给出了答案。为了澄清一下,我并不是在寻找如何编写采样方案的解释,而是希望能找到一个简单的方法,从给定的物品和权重中进行多项分布的采样,或者被告知在标准库中没有这样的函数,所以需要自己编写一个。

9 个回答

14

因为没有人使用过 numpy.random.choice 这个函数,所以这里有一个可以在一行代码里生成你需要的东西的函数:

numpy.random.choice(['a','b','c'], size = 20, p = [0.3,0.4,0.3])
19

这可能就是你想要的效果:

numpy.array([.3,.4,.3]).cumsum().searchsorted(numpy.random.sample(5))
11
import numpy

n = 1000
pairs = [(.3, 'a'), (.3, 'b'), (.4, 'c')]
probabilities = numpy.random.multinomial(n, zip(*pairs)[0])
result = zip(probabilities, zip(*pairs)[1])
# [(299, 'a'), (299, 'b'), (402, 'c')]
[x[0] * x[1] for x in result]
# ['aaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbb', 'cccccccccccccccccccc']

你希望以什么方式收到结果呢?

撰写回答