Python 3: выбор случайных парных элементов из массива без повторений - PullRequest
0 голосов
/ 25 мая 2018

Я хочу выбрать случайные пары элементов из массива совокупности в каждом цикле без повторений.

В моем коде я создаю массив совокупности, а затем передаю его в функцию выбора, где я сгенерирую два случайных индексачисла в каждом цикле, и на основе этого я выберу пару элементов из массива населения.поэтому, если у меня есть размер популяции 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] снова

Любой совет будет высоко ценится

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Создайте список индексов с помощью:

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]]])
0 голосов
/ 25 мая 2018

Чтобы избежать дубликатов, сгенерируйте весь набор индексов, перемешайте его и вытолкните пары значений индекса из перемешанного набора.Например:

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

Это основано на генераторе, поэтому вы можете сгенерировать столько или сколько пар, сколько пожелаете, вплоть до всего набора.

...