如何使用Python从多个分类分布中采样

时间:2019-02-18 17:17:19

标签: python numpy random montecarlo

让P是一个数组,其中每一行的总和为1。如何生成矩阵A,其中

  • A具有与P相同的尺寸,并且A_ {ij}等于1,概率为P_ {ij}

  • A在每行中只有一个等于1的条目,而其他所有条目均为零

如何在Numpy或Scipy中执行此操作?

我可以使用for循环来做到这一点,但这显然很慢。有没有一种方法可以使用Numpy提高效率?还是Numba?

2 个答案:

答案 0 :(得分:0)

这是维基百科的内容。

import numpy.random as rnd
import numpy as np

A_as_numbers = np.argmax(np.log(P) + rnd.gumbel(size=P.shape), axis=1)
A_one_hot = np.eye(P.shape[1])[A_as_numbers].reshape(P.shape)

在以下位置进行了测试:

P = np.matrix([[1/4, 1/4, 1/4, 1/4], [1/3,1/3,1/6,1/6]])

知道:

array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.]])

答案 1 :(得分:0)

好的,使用带有2d扩展的选择

import numpy as np

def f(P):
    a = np.zeros(4, dtype=np.int64)
    q = np.random.choice(4, size=1, replace=True, p=P)
    a[q] = 1
    return a

P = np.array([[1/4, 1/4, 1/4, 1/4],
              [1/3,1/3,1/6,1/6]])

r = np.apply_along_axis(f, 1, P)
print(r)

[[0 0 0 1]  [0 0 1 0]]

[[1 0 0 0]  [0 1 0 0]]