首页 > 解决方案 > 当样本长度与总体相同时,Python random.sample 给出“样本大于总体或为负”

问题描述

如果我的人口中的项目数等于我想要样本的数量,我会收到错误消息。

这是一个最小的例子

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)

而且我没有收到错误。我无法弄清楚第一个问题是什么。. .

标签: python

解决方案


问题是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]

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


推荐阅读