python中的随机抽样

python中的随机抽样,python,python-2.7,Python,Python 2.7,您好,请输入下面的代码,当大小>5时抛出下面的错误。在Python2.7中是否会有另一个随机函数,可以从初始个体生成6个或更多不同的样本,这样总体将附加6个列表。多谢各位 import random as rand population = [] individual = [1,2,3,4,5] size = 5 for ind in individual: population.append((rand.sample(individual, size))) print "

您好,请输入下面的代码,当大小>5时抛出下面的错误。在Python2.7中是否会有另一个随机函数,可以从初始个体生成6个或更多不同的样本,这样总体将附加6个列表。多谢各位

import random as rand

population = []
individual = [1,2,3,4,5]
size = 5

for ind in individual:
        population.append((rand.sample(individual, size)))

print "pop", population

#output
pop =  [[1, 3, 5, 2, 4], [3, 4, 5, 2, 1], [3, 1, 2, 4, 5], [1, 5, 3, 4, 2], [1, 5, 3, 2, 4]] 
#错误消息
回溯(最近一次呼叫最后一次):
文件“C:/Users/AMAMIFE/Desktop/obi/tt.py”,第10行,在
population.append((随机样本(个体,大小)))
示例中第321行的文件“C:\Python27\x86\lib\random.py”
提升值错误(“样本大于总体”)
ValueError:样本大于总体

您正在更改错误的变量;您应该更改
for
循环,而不是
sample
的参数:

size = len(individual)
pop_size = 6
for _ in range(pop_size):
    population.append(rand.sample(individual, size))
请注意,
pop_size
是要添加到
population
的子列表的数量,而
size
个体的长度。你也可以考虑使用:

for _ in range(pop_size):
    rand.shuffle(individual)
    population.append(individual[:])

i、 e.在每次迭代中,随机洗牌
单个
,并将其副本附加到
总体

中,因为您更改了错误的变量;您应该更改
for
循环,而不是
sample
的参数:

size = len(individual)
pop_size = 6
for _ in range(pop_size):
    population.append(rand.sample(individual, size))
请注意,
pop_size
是要添加到
population
的子列表的数量,而
size
个体的长度。你也可以考虑使用:

for _ in range(pop_size):
    rand.shuffle(individual)
    population.append(individual[:])
i、 e.在每次迭代中,随机洗牌
单个
,并将其副本附加到
总体

尝试以下方法:

import random as rand
individual = 5
population = []
size = 5

for ind in individual:
        population.append((rand.sample(xrange(individual), size)))

print "pop", population
试试这个:

import random as rand
individual = 5
population = []
size = 5

for ind in individual:
        population.append((rand.sample(xrange(individual), size)))

print "pop", population

使用列表理解:

from random import choice
pop = [[choice(individual) for _ in range(size)] for _ in range(size)]
只要
单个
不是空序列,这将起作用

注意:我使用
size
变量表示每个子列表的大小和子列表的数量。如果你想要5个10个值的列表,你必须相应地调整它


编辑:缩短一些变量名,以便于阅读。

使用列表理解:

from random import choice
pop = [[choice(individual) for _ in range(size)] for _ in range(size)]
只要
单个
不是空序列,这将起作用

注意:我使用
size
变量表示每个子列表的大小和子列表的数量。如果你想要5个10个值的列表,你必须相应地调整它


编辑:缩短一些变量名,以便于阅读。

此处使用的
sample
方法似乎不正确<代码>随机。样本(a_序列,n)
a_序列
中随机选择
n
对象。例如:

>>> import random
>>> my_list = range(5)
>>> random.sample(my_list, 3)
[0, 3, 2]
>>> random.sample(my_list, 3)
[4, 1, 0]
>>> random.sample(my_list, 3)
[2, 0, 4]
>>> random.sample(my_list, 3)
[4, 0, 2]
>>> random.sample(my_list, 3)
[1, 4, 3]
尝试从5个项目的列表中抽取6个项目是没有意义的。在你取出5件物品后,就没有第六件物品可供你取出了

当你说你想从一个5号的列表中抽取5个项目时,你只是说你想把所有的东西都按随机顺序排列。如果您想获得其中的
n
,请尝试使用
itertools.permutations

>>> import random
>>> import itertools
>>> my_list = range(5)
>>> random.sample(list(itertools.permutations(my_list)), 5)
[(4, 2, 1, 3, 0), (3, 0, 2, 4, 1), (2, 3, 0, 4, 1), (4, 3, 0, 1, 2), (4, 0, 3, 2, 1)]
>>> random.sample(list(itertools.permutations(my_list)), 6)
[(0, 2, 1, 4, 3), (1, 2, 4, 0, 3), (1, 0, 3, 2, 4), (2, 1, 4, 3, 0), (0, 3, 2, 1, 4), (4, 2, 0, 1, 3)]
>>> random.sample(list(itertools.permutations(my_list)), 7)
[(4, 3, 1, 2, 0), (3, 0, 1, 2, 4), (2, 0, 1, 3, 4), (4, 2, 3, 1, 0), (0, 4, 1, 3, 2), (3, 0, 2, 1, 4), (0, 1, 2, 3, 4)]

您在此处使用
sample
的方式似乎不正确<代码>随机。样本(a_序列,n)
a_序列
中随机选择
n
对象。例如:

>>> import random
>>> my_list = range(5)
>>> random.sample(my_list, 3)
[0, 3, 2]
>>> random.sample(my_list, 3)
[4, 1, 0]
>>> random.sample(my_list, 3)
[2, 0, 4]
>>> random.sample(my_list, 3)
[4, 0, 2]
>>> random.sample(my_list, 3)
[1, 4, 3]
尝试从5个项目的列表中抽取6个项目是没有意义的。在你取出5件物品后,就没有第六件物品可供你取出了

当你说你想从一个5号的列表中抽取5个项目时,你只是说你想把所有的东西都按随机顺序排列。如果您想获得其中的
n
,请尝试使用
itertools.permutations

>>> import random
>>> import itertools
>>> my_list = range(5)
>>> random.sample(list(itertools.permutations(my_list)), 5)
[(4, 2, 1, 3, 0), (3, 0, 2, 4, 1), (2, 3, 0, 4, 1), (4, 3, 0, 1, 2), (4, 0, 3, 2, 1)]
>>> random.sample(list(itertools.permutations(my_list)), 6)
[(0, 2, 1, 4, 3), (1, 2, 4, 0, 3), (1, 0, 3, 2, 4), (2, 1, 4, 3, 0), (0, 3, 2, 1, 4), (4, 2, 0, 1, 3)]
>>> random.sample(list(itertools.permutations(my_list)), 7)
[(4, 3, 1, 2, 0), (3, 0, 1, 2, 4), (2, 0, 1, 3, 4), (4, 2, 3, 1, 0), (0, 4, 1, 3, 2), (3, 0, 2, 1, 4), (0, 1, 2, 3, 4)]

如果原始总体仅包含五项,您将如何生成六个不同的样本?您所说的“样本”是什么意思?如果原始总体仅包含五项,您将如何生成六个不同的样本?您所说的“样本”是什么意思?这并不能解决大小大于个人数量时出现的问题。答案出现在低质量审查队列中,可能是因为您没有解释某些内容。如果你解释了这一点(在你的答案中),你就更有可能获得更多的选票,提问者实际上学到了一些东西!使用新版本2.3。对于python,random.sample(population,k)返回一个新列表,其中包含来自population的元素,同时保持原始population不变。结果列表按选择顺序排列,因此所有子切片也将是有效的随机样本。这允许抽奖获奖者(样本)被划分为大奖和第二名获奖者(子牌)。人口的成员不必是可散列的或唯一的。如果填充包含重复,则每次出现都是样本中可能的选择。若要从整数范围中选择样本,请使用xrange()对象作为参数。这对于从大量人群中进行抽样来说尤其快速且节省空间:sample(xrange(10000000),60)。这并不能解决当规模大于个体数量时出现的问题。这个答案出现在低质量审查队列中,可能是因为您没有解释某些内容。如果你解释了这一点(在你的答案中),你就更有可能获得更多的选票,提问者实际上学到了一些东西!使用新版本2.3。对于python,random.sample(population,k)返回一个新列表,其中包含来自population的元素,同时保持原始population不变。结果列表按选择顺序排列,因此所有子切片也将是有效的随机样本。这允许抽奖获奖者(样本)被划分为大奖和第二名获奖者(子牌)。人口的成员不必是可散列的或唯一的。如果填充包含重复,则每次出现都是样本中可能的选择。若要从整数范围中选择样本,请使用xrange()对象作为参数。这对于从大量人群中进行采样尤其快速且节省空间:sample(xrange(10000000),60)。