python - 当样本长度与总体相同时,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)
而且我没有收到错误。我无法弄清楚第一个问题是什么。. .
解决方案
问题是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]
这可确保您采样的元素永远不会超过集合中的元素。
推荐阅读
- r - 如何修复此错误:Recipes 无法在 Caret:: Train 中加载?
- python - 错误:需要 Microsoft Visual C++ 14.0。使用“Microsoft Visual C++ Build Tools”来安装 Python 模块
- c++ - Puzzle solving c++ code sometimes works and sometimes it doesn't
- angular - Ag Grid not displaying column values for which grouping by row is enabled angular 8
- windows - Best method to automate across platforms
- laravel - Laravel 6.x Password reset with different name email column
- javascript - How to merge the contents of a nested array of objects?
- html - How to pass input value to function in view.py
- javascript - How to reconnect / join an existing Google Cast session from Chrome
- javascript - 事件处理程序中的 preventDefault() 禁止更改检测