random.choices() 和 random.sample() 函数有啥区别?
Posted
技术标签:
【中文标题】random.choices() 和 random.sample() 函数有啥区别?【英文标题】:What is the difference between the random.choices() and random.sample() functions?random.choices() 和 random.sample() 函数有什么区别? 【发布时间】:2020-05-02 23:01:06 【问题描述】:我有以下列表:list = [1,1,2,2]
。
应用sample
方法(rd.sample(list, 3)
)后,输出为[1, 1, 2]
。
应用choices
方法(rd.choices(list, 3)
)后,输出为:[2, 1, 2]
。
这两种方法有什么区别?什么时候应该优先选择一个?
【问题讨论】:
【参考方案1】:根本区别在于random.choices()
将(最终)在同一位置绘制元素(总是从整个序列中采样,因此,一旦绘制,元素就会被替换 - 替换),而random.sample()
不会(一旦选择了元素,它们就会从总体中移除以进行抽样,因此,一旦绘制元素就不会被替换 - 没有替换)。
注意这里replaced(replacement)应该理解为placed back(placement back),而不是的同义词em>替换(和替换)。
为了更好地理解它,让我们考虑以下示例:
import random
random.seed(0)
ll = list(range(10))
print(random.sample(ll, 10))
# [6, 9, 0, 2, 4, 3, 5, 1, 8, 7]
print(random.choices(ll, k=10))
# [5, 9, 5, 2, 7, 6, 2, 9, 9, 8]
如您所见,random.sample()
不会产生重复元素,而 random.choices()
会。
在您的示例中,这两种方法都有重复值,因为您在原始序列中有重复值,但是在 random.sample()
的情况下,这些重复值必须来自原始输入的不同位置。
最终,sample()
不能超过输入序列的大小,而 choices()
则不是问题:
# print(random.sample(ll, 20))
# ValueError: Sample larger than population or is negative
print(random.choices(ll, k=20))
# [9, 3, 7, 8, 6, 4, 1, 4, 6, 9, 9, 4, 8, 2, 8, 5, 0, 7, 3, 8]
有关采样过程的更一般性和理论性的讨论可以在 Wikipedia 上找到。
【讨论】:
【参考方案2】:基本区别是这样的:
如果您想从列表中选择多个随机项目而不包括重复项,请使用random.sample
函数。
当您想从列表中选择多个项目(包括重复项)时,请使用random.choices
函数。
这里有两个例子来说明区别:
import random
alpha_list=['Batman', 'Flash', 'Wonder Woman','Cyborg', 'Superman']
choices=random.choices(alpha_list,k=7)
print(choices)
sample= random.sample(alpha_list,k=3)
print(sample)
Output: ['Cyborg', 'Cyborg', 'Wonder Woman', 'Flash', 'Wonder Woman', 'Flash', 'Batman']
['Superman', 'Flash', 'Batman']
从上面的例子你可以看到,在 random.choices() 中你可以传递 'k' 大于你的序列长度,因为 random.choices() 允许重复 .
然而,如果你在 random.sample() 中传递一个大于序列长度的 'k' 值,你会得到一个错误:
样本大于总体或为负数。
现在,来看看用例:
random.choices(sequence, weights=None, cum_weights=None, k=1)
:当您可以负担得起重复抽样时,您想使用它。这就是为什么我们可以给出 k
> len(dataset)
的值。
random.sample(sequence, k)
:当您在采样数据时无法承受重复数据时,您希望使用它。
进一步阅读:
random.choices
random.sample
【讨论】:
以上是关于random.choices() 和 random.sample() 函数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章