我想生成一个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.随机选择首先返回最高概率组合
答案 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种不同的概率