【问题标题】:How to apply numpy random.choice to a matrix of probability values (Vectorized solution)如何将 numpy random.choice 应用于概率值矩阵(矢量化解决方案)
【发布时间】:2016-11-08 05:54:54
【问题描述】:

我遇到的问题如下

我有一个包含 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 循环或列表推导,但我正在寻找一种快速/矢量化的解决方案。

【问题讨论】:

标签: python numpy


【解决方案1】:

这是一种方法。

这是概率数组:

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])

【讨论】:

  • 可爱的想法!
  • 相当整洁!谢谢!
  • 由于速度是问题的一部分,argmax 是正确的解决方案吗?也许 searchsorted 会更有意义?
  • 理论上,searchsorted 是有意义的,但 searchsorted 没有 axis 参数来允许沿二维数组的轴进行操作,因此您必须编写Python中的一个循环,这很慢。但是对于 large 数组,它可能比argmax 更快。试一试,如果看起来不错,请添加另一个答案。
  • 如果您使用的是 pd.DataFrame,最好使用 choices = (u &lt; c).idxmax(axis=1) 而不是 choices = (u &lt; c).argmax(axis=1)
猜你喜欢
  • 2019-10-18
  • 1970-01-01
  • 2021-06-30
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
相关资源
最近更新 更多