嗨请注意下面的代码,当尺寸>时抛出下面的错误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
答案 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
的子列表的数量,而size
是individual
的长度。您还可以考虑使用:
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