gpt4 book ai didi

python - 根据Python中的条件从两个数组中随机选择

转载 作者:行者123 更新时间:2023-12-01 01:12:46 25 4
gpt4 key购买 nike

假设我有两个长度相等的数组:

a = [0,0,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1]
b = [0,1,1,0,1,0,0,1,1,0,0,1,1,0,1,0,0]

现在我想按照给定的顺序从这两个数组中选取元素,以便它们通过按 a:b = 的比例随机选择 a 和 b 之间的值来形成与 a 和 b 长度相同的新数组4.68 即,对于从 a 中选取的每 1 个值,在结果数组中应该有 4.68 个从 b 中选取的值。

因此,结果数组可能类似于:

res = [0,1,1,0,1, 1(from a) ,0(from a),1,1,0,0,1,1,0, 0(from a),0,0]

res 数组有:前 5 个值来自 b,第 6 个和第 7 个值来自 a,第 8-14 个值来自 b,第 15 个值来自 a,第 16-17 个值来自 b

给定 res 数组示例中 a:b 值的总体比率为 a:b 4.67(来自 a = 3 ,来自 b = 14 )

因此,在两个数组之间,必须随机选择值,但需要保持序列,即不能从一个数组中取出第 7 个值,从另一个数组中取出第 3 个值。如果要填充到结果数组中的值是第 3 个值,则随机选择两个输入数组的第三个元素。此外,还需要保持总体比率。

你能帮我开发一种高效的 Pythonic 方式来实现这个结果解决方案吗?该解决方案不需要与每次运行的值保持一致

最佳答案

借用Barmar's answer中的a_count计算(因为它似乎有效,而且我懒得重新发明它),此解决方案保留了从 ab 中选择的值的顺序:

from future_builtins import zip  # Only on Python 2, to avoid temporary list of tuples
import random

# int() unnecessary on Python 3
a_count = int(round(1/(1 + 4.68) * len(a)))

# Use range on Python 3, xrange on Python 2, to avoid making actual list
a_indices = frozenset(random.sample(xrange(len(a)), a_count))

res = [aval if i in a_indices else bval for i, (aval, bval) in enumerate(zip(a, b))]

这里的基本思想是,您确定需要多少个 a 值,获取该大小的可能索引的唯一样本,然后迭代 a >b 并行,保留所选索引的 a 值,以及所有其他索引的 b 值。

如果您不喜欢 list 理解的复杂性,您可以使用不同的方法,复制 b,然后填写 a 值一一对应:

res = b[:]  # Copy b in its entirety

# Replace selected indices with a values
# No need to convert to frozenset for efficiency here, and it's clean
# enough to just iterate the sample directly without storing it
for i in random.sample(xrange(len(a)), a_count):
res[i] = a[i]

关于python - 根据Python中的条件从两个数组中随机选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54677146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com