python中的随机抽样

时间:2014-05-19 14:54:44

标签: python python-2.7

嗨请注意下面的代码,当尺寸>时抛出下面的错误5.在python 2.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]] 
#Error Message
Traceback (most recent call last):
  File "C:/Users/AMAMIFE/Desktop/obi/tt.py", line 10, in <module>
    population.append((rand.sample(individual, size)))
  File "C:\Python27\x86\lib\random.py", line 321, in sample
    raise ValueError("sample larger than population")
ValueError: sample larger than population

4 个答案:

答案 0 :(得分:4)

您在此使用sample的方式似乎不正确。 random.sample(a_sequence, n)随机选择n中的a_sequence个对象。例如:

>>> 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)]

答案 1 :(得分:1)

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

size = len(individual)
pop_size = 6
for _ in range(pop_size):
    population.append(rand.sample(individual, size))

请注意,pop_size是要添加到population的子列表的数量,而sizeindividual的长度。您还可以考虑使用:

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

即。在每次迭代中随机随机播放individual并将其副本附加到population

答案 2 :(得分:1)

使用列表理解:

from random import choice
pop = [[choice(individual) for _ in range(size)] for _ in range(size)]

只要individual不是空序列,这将有效。

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

编辑:缩短一些变量名称,使其更容易阅读。

答案 3 :(得分:0)

试试这个:

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

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

print "pop", population