【发布时间】:2021-08-18 18:41:37
【问题描述】:
我想为列表中的每个项目添加概率,而该列表在另一个列表中。
一些伪代码:
myList = [ [a, b, c, d], [e, f, g, h], [i, j, k, l], [m, n, o], [p, q, r], [s, t, u] ]
probabilities = [ [0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.075, 0.025], [0.55, 0.35, 0.1], [0.55, 0.35, 0.1], [0.55, 0.35, 0.1] ]
有没有办法做到这一点?
进一步:
我的需要是创建另一个类似于下面的列表...
newList = [ [b, e, k, o, p, s], [a, f, i, m, r, t], ... etc. ]
在给定概率的情况下,随机选择每个元素,并且 newList 中没有两个列表是相同的。我不确定这是否可以实现。
到目前为止我的代码:
layers = [list(Path(directory).glob("*.png")) for directory in ("dir1/", "dir2/", "dir3/", "dir4/", "dir5/", "dir6/")]
list_of_prob = [[0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.075, 0.025], [0.6, 0.3, 0.1], [0.6, 0.3, 0.1], [0.6, 0.3, 0.1]]
rwp = [choices(layers, list_of_prob, k=????)]
rand_combinations = [([choice(k) for k in layers]) for i in choice_indices]
我不完全确定choices() 中的k 是什么,例如。列表的数量或列表中的总元素数。 Layers 是图片路径的列表,.pngs,与上面伪代码中提供的“myList”格式相同(dir1 中 4 个图像,dir2 中 4 个图像,dir3 中 4 个图像,dir4 中 3 个,dir5 中 3 个, 3 在 dir6)。
我已经有代码可以遍历列表并创建随机图像,但我希望仅在 x% 的时间内生成一些图像。因此,我原来的问题。对不起,如果我只是把事情复杂化了,我试着简化它。
【问题讨论】:
-
放心,你想做的绝对是可能的。您可以发布您到目前为止编写的代码来尝试执行此操作吗?
-
myList的元素应该是字符串吗?你需要引用它们。 -
使用
random.choices()及其weights参数。 -
我从技术上理解您的问题,这并不难:首先,使用概率重新排序每个列表,然后使用merge them together using
itertools.zip_longest并过滤掉Nones。但是从数学上讲,你如何在不被概率替换的情况下订购东西?您是否只是删除选择元素的概率,将其余部分相加并将所有其余部分除以它们的总和?您是否一直选择元素,直到您至少选择了每个元素?是一样的吗? -
@Barmar 不,它们实际上是图像路径。我使用“a,b,c ...”作为伪代码。我试过 random.choices() 但它似乎不喜欢那种语法
标签: python probability nested-lists