Python 3:从numpy数组中选择随机对元素而不重复
Python 3: Selecting random pair elements from a numpy array without repetition
我想 select 在每个循环中随机配对来自总体数组的元素而不重复。
在我的代码中,我创建了一个人口数组,然后将其传递给 selection 函数,我将在每个循环中生成两个随机索引号,并基于它 select population 数组中的 pair 元素。
因此,如果我的人口规模为 5,那么我的结果规模将为 10,因为在每个循环中我将获得两个元素。
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]
任何建议将不胜感激
为避免重复生成整个索引集,将其打乱,然后从打乱后的集合中弹出索引值对。例如:
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)])
这是基于生成器的,因此您可以根据需要生成尽可能少的对,最多可以生成整个集合。
创建索引列表:
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)]
并将其应用于您的人群:
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]]])
我想 select 在每个循环中随机配对来自总体数组的元素而不重复。
在我的代码中,我创建了一个人口数组,然后将其传递给 selection 函数,我将在每个循环中生成两个随机索引号,并基于它 select population 数组中的 pair 元素。 因此,如果我的人口规模为 5,那么我的结果规模将为 10,因为在每个循环中我将获得两个元素。
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]
任何建议将不胜感激
为避免重复生成整个索引集,将其打乱,然后从打乱后的集合中弹出索引值对。例如:
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)])
这是基于生成器的,因此您可以根据需要生成尽可能少的对,最多可以生成整个集合。
创建索引列表:
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)]
并将其应用于您的人群:
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]]])