Gan*_*h M 20 python random python-3.x
我有以下列表:list = [1,1,2,2].
应用sample方法 ( rd.sample(list, 3)) 后,输出为[1, 1, 2]。
应用choices方法(rd.choices(list, 3))后,输出为:[2, 1, 2]。
这两种方法有什么区别?什么时候应该优先选择一个?
nor*_*ok2 27
根本区别在于random.choices()(最终)将在相同位置绘制元素(始终从整个序列中采样,因此,一旦绘制,元素将被替换 -带有替换),而random.sample()不会(一旦元素被选中,它们将从要抽样的总体,因此,一旦绘制元素就不会被替换 -没有替换)。
注意,这里所取代(置换)应当被理解为放回(放置背面),而不是作为同义词取代的(和取代)。
为了更好地理解它,让我们考虑以下示例:
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]
Run Code Online (Sandbox Code Playgroud)
如您所见,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]
Run Code Online (Sandbox Code Playgroud)
可以在Wikipedia上找到关于采样过程的更一般性和理论性的讨论。
基本区别是:
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']
Run Code Online (Sandbox Code Playgroud)
从上面的示例中您可以看到,在 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):当您在对数据进行采样时无法承受重复项时,您会希望使用此功能。进一步阅读: