Python 3: Selecting random pair elements from a numpy array without repetition
我想在每个循环中从总体数组中选择随机对元素,而无需重复。
在我的代码中,我创建了一个填充数组,然后将其传递给选择函数,在该函数中,我将在每个循环中生成两个随机索引号,并基于此,从填充数组中选择对元素。
因此,如果人口总数为5,则结果大小将为10,因为在每个循环中,我将得到两个元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import random import numpy as np population_size = 5 dimension= 2 upper = 1 lower = 0 pair_loop = 1 pair_size = 2 def select (pop parents = np.zeros((0, dimension), dtype=np.float_) for i in range (population_size): for ii in range (pair_loop): random_index= np.random.randint (population_size, size=(pair_size)) parents = np.vstack((parents, population[random_index,])) print (i ,"random_index", random_index) print (parents) return (parents) population = np.random.choice(np.linspace(lower, upper, 10), size=(population_size,dimension), replace=True) parents = select(population) |
我想得到两个不同的元素,我不想重复相同的索引号,
例如,如果我有:[2,4]
我不想再次看到[2,4]或[4,2]
任何建议将不胜感激
使用以下命令创建索引列表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import itertools, random def select(size, pair_size): g =itertools.combinations(range(size),pair_size) alist = list(g) random.shuffle(alist) return alist In [42]: alist = select(5,2) In [43]: alist Out[43]: [(0, 3), (1, 3), (2, 3), (0, 2), (0, 4), (3, 4), (0, 1), (2, 4), (1, 2), (1, 4)] |
并将其应用于您的人群:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | In [44]: population = np.random.choice(np.arange(10,20), size=(5,2), replace=Tru ...: e) In [45]: population Out[45]: array([[18, 19], [16, 17], [10, 11], [10, 15], [14, 15]]) In [46]: population[alist,] Out[46]: array([[[18, 19], [10, 15]], [[16, 17], [10, 15]], [[10, 11], [10, 15]], [[18, 19], [10, 11]], [[18, 19], [14, 15]], [[10, 15], [14, 15]], [[18, 19], [16, 17]], [[10, 11], [14, 15]], [[16, 17], [10, 11]], [[16, 17], [14, 15]]]) |
为避免重复生成整个索引集,请对其进行随机排序,然后从随机组合中弹出对索引值。 例如:
1 2 3 4 5 6 7 8 9 10 11 | import random def pair_generator(population_size): pop_range = 2 * population_size population = [i for i in range(1, pop_range + 1)] random.shuffle(population) for _ in range(population_size): yield [population.pop(), population.pop()] population_size = 5 print([pair for pair in pair_generator(population_size)]) |
这是基于生成器的,因此您可以生成任意数量的对,最多可以生成整个对。