如何将numpy random.choice应用于概率值矩阵(Vectorized solution)

max*_*mir 4 python numpy

我遇到的问题如下

我有一个带有3个值的1-D整数列表(或np.array)

l = [0,1,2]
Run Code Online (Sandbox Code Playgroud)

我有一个二维概率列表(为简单起见,我们将使用两行)

P = 
[[0.8, 0.1, 0.1],
 [0.3, 0.3, 0.4]]
Run Code Online (Sandbox Code Playgroud)

我想要的是numpy.random.choice(a=l, p=P),P(概率分布)中的每一行都应用于l.所以,我希望从[0,1,2]中随机抽取一个随机样本.DIST.首先是[0.8,0.1,0.1],然后是概率.DIST.[0.3,0.3,0.4]接下来,给我两个输出.

=====更新======

我可以使用for循环或列表理解,但我正在寻找一个快速/矢量化的解决方案.

War*_*ser 8

这是一种方式.

这是一系列概率:

In [161]: p
Out[161]: 
array([[ 0.8 ,  0.1 ,  0.1 ],
       [ 0.3 ,  0.3 ,  0.4 ],
       [ 0.25,  0.5 ,  0.25]])
Run Code Online (Sandbox Code Playgroud)

c 持有累积分布:

In [162]: c = p.cumsum(axis=1)
Run Code Online (Sandbox Code Playgroud)

生成一组均匀分布的样本......

In [163]: u = np.random.rand(len(c), 1)
Run Code Online (Sandbox Code Playgroud)

......然后看看他们"适合"的地方c:

In [164]: choices = (u < c).argmax(axis=1)

In [165]: choices
Out[165]: array([1, 2, 2])
Run Code Online (Sandbox Code Playgroud)