当采样长度与总体相同时,Python random.sample给出“样品大于总体或为负数”

时间:2018-09-11 00:39:40

标签: python

如果总体中的项目数量等于我要抽样的数量,则会出现错误。

这是一个最小的例子

import random

subset = random.sample( set([312996, 529565, 312996, 130934]) ,  4)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-b816cd5c3651> in <module>()
----> 1 subset = random.sample( set([312996, 529565, 312996, 130934]) ,  4)

/opt/conda/lib/python3.6/random.py in sample(self, population, k)
    318         n = len(population)
    319         if not 0 <= k <= n:
--> 320             raise ValueError("Sample larger than population or is negative")
    321         result = [None] * k
    322         setsize = 21        # size of a small set minus size of an empty list

ValueError: Sample larger than population or is negative

编辑

这似乎只对这4个数字有效。我尝试过

import random

subset =  random.sample( set([2, 5, 8, 9]) ,  4)

我没有收到错误消息。我不知道第一个问题是什么。 。 。

1 个答案:

答案 0 :(得分:1)

问题是set([312996, 529565, 312996, 130934])只有3个元素

s = set([312996, 529565, 312996, 130934])

for element in s:
    print(element)

输出

312996
529565
130934

集合仅包含唯一元素,因此函数set()删除重复元素312996。在第二个示例中,set([2, 5, 8, 9])有4个不同的元素。您可以通过以下方式避免该错误:

import random

s = {312996, 529565, 312996, 130934}
subset = random.sample(s, min(len(s), 4))

print(subset)

输出

[130934, 312996, 529565]

这可确保您采样的元素绝不会超过集合中的元素。