Создать 2D-список на основе вероятности - PullRequest
0 голосов
/ 09 мая 2018

Я хочу сгенерировать n -строчный список, где каждая строка равна k столбцам.
Тогда порядок основан на вероятности.

Дано: L = [1, 2, 3] и список вероятностей P = [0.3, 0.2, 0.5],

Ожидаемый результат на основе вероятности:

[[3, 3],[3, 1],[1, 3],[3, 2],[2, 3],[1, 1]]

, где [3,3] - первое, поскольку оно дает наибольшую вероятность 1.0.
второй [3,1] с 0.8 и т. д.

Вот мой код:

L = [3, 1, 2]        # Input List
P = [0.3, 0.2, 0.5]  # Probability List
k = 2                # 2 columns per row
n = 6                # 6 rows in 2D array

nL = np.array(L)

generated_list = np.zeros(shape=(1, k), dtype=int)
while generated_list.shape[0] != n:
    choice = np.random.choice(L, size=k, p=P)
    if not np.any(generated_list == [choice]):
        generated_list = np.append(generated_list, [choice], axis=0)

У меня не может быть упорядоченного списка, основанного на вероятности.
Он также содержит дубликаты элементов.

Образец generated_list Вывод:

[[0, 0],[3, 1],[2, 3],[1, 2],[2, 3],[2, 3]]

Какой лучший способ сделать это:
1. Сравните, если 1-D элемент уже находится в 2-D массиве
2. Пусть случайный выбор вернет первую комбинацию с наибольшей вероятностью

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Это должно сделать это, с небольшой помощью itertools.product :

from itertools import product

L = [1, 2, 3]
P = [0.3, 0.2, 0.5]

n = 2
k = 6

probs = dict(zip(L, P))

result = sorted(list(product(L, repeat=n)), key=lambda x: (sum(probs[i] for i in x), [probs[i] for i in x]), reverse=True)[:k]
0 голосов
/ 09 мая 2018

Вы можете использовать sorted:

l = [[0, 0],[3, 1],[2, 3],[1, 2],[2, 3],[2, 3]]
p = [0.1, 0.2, 0.2, 0.5]
sorted(l, key= lambda x: sum(p[v] for v in x))

возвращается:

[[3, 1], [2, 3], [2, 3], [2, 3], [1, 2], [0, 0]]

(я предположил, что у вас было 4 разных вероятности, поскольку у вашего generated_list есть индексы от 0 до 3)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...