根据概率

时间:2018-05-09 14:31:20

标签: python numpy

我想生成一个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 :(得分:2)

这应该在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]

答案 1 :(得分:1)

您可以使用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]]

(我假设您的generated_list索引为0到3时有4种不同的概率