Python 3.x Python3:不重复地从numpy数组中选择随机对元素

Python 3.x Python3:不重复地从numpy数组中选择随机对元素,python-3.x,numpy,random,repeat,Python 3.x,Numpy,Random,Repeat,我想从每个循环中的总体数组中选择随机对元素,而不重复 在我的代码中,我创建了一个填充数组,然后将其传递给选择函数,在该函数中,我将在每个循环中生成两个随机索引号,并根据它从填充数组中选择成对元素。 所以如果我有一个人口规模5,那么我的结果规模将是10,因为在每个循环中,我将得到两个元素 import random import numpy as np population_size = 5 dimension= 2 upper = 1 lower = 0 pair_loop = 1 pair_s

我想从每个循环中的总体数组中选择随机对元素,而不重复

在我的代码中,我创建了一个填充数组,然后将其传递给选择函数,在该函数中,我将在每个循环中生成两个随机索引号,并根据它从填充数组中选择成对元素。 所以如果我有一个人口规模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]]])

但我从你的发电机上只得到5件物品;OP显然期望10个。@hpaulj OP询问如何获得唯一配对,此演示说明了这一点。将
population\u size
设置为您喜欢的任何值。您可能需要给出一个更具体的示例,因为答案会做出不同的假设。谢谢,这是一个很好的方法,但如果我随机只需要一对或两对,而不是所有可能的对,该怎么办
g=itertools.组合(范围(大小),配对大小)
这里我有
range
pair\u大小
我还可以随机添加多少对@HPAULJ您可以尝试
np.random。从
列表(g)
中选择
。我不认为这是对
shuffle
的改进。不能直接从生成器中进行随机选择。