Как применить numpy random.выбор матрицы вероятностных значений (Векторизованное решение)

Проблема у меня следующая

У меня есть 1-D список целых чисел (или np.array) с 3 значениями

l = [0,1,2]

У меня есть 2-D список вероятностей (для простоты мы будем использовать две строки)

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] сначала с prob. расстояние. [0.3, 0.3, 0.4] далее, чтобы дать мне два выхода.

===== Обновление======

Я могу использовать для циклов или понимания списка, но я ищу быстрое/векторизованное решение.

1 ответ

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