我遇到的问题如下
我有一个包含 3 个值的一维整数列表(或 np.array)
l = [0,1,2]
我有一个二维概率列表(为简单起见,我们将使用两行)
P =
[[0.8, 0.1, 0.1],
[0.3, 0.3, 0.4]]
我想要的是 numpy.random.choice(a=l, p=P)
,其中 P(概率分布)中的每一行都应用于 l。所以,我想从 [0,1,2] 中抽取一个随机样本,概率为。区[0.8, 0.1, 0.1] 首先,然后是概率。区[0.3, 0.3, 0.4] 接下来,给我两个输出。
=====更新======
我可以使用 for 循环或列表理解,但我正在寻找一种快速/矢量化的解决方案。
最佳答案
这是一种方法。
这是概率数组:
In [161]: p
Out[161]:
array([[ 0.8 , 0.1 , 0.1 ],
[ 0.3 , 0.3 , 0.4 ],
[ 0.25, 0.5 , 0.25]])
c
保存累积分布:
In [162]: c = p.cumsum(axis=1)
生成一组均匀分布的样本...
In [163]: u = np.random.rand(len(c), 1)
...然后查看它们在 c
中“适合”的位置:
In [164]: choices = (u < c).argmax(axis=1)
In [165]: choices
Out[165]: array([1, 2, 2])
关于python - 如何将 numpy random.choice 应用于概率值矩阵(矢量化解决方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40474436/