Tengo dos listas cluster0Y y clusterY que se componen de 1 y 0. P.ej.

cluster0Y = [0,1,0,0,1]
cluster1Y = [0,0,0,1]

Quiero muestrear al azar 1 elemento de las listas cluster0Y y cluster1Y donde el valor es 1. Luego quiero imprimir la lista a la que pertenece e imprimir el índice. Para hacer esto escribí el siguiente código:

from random import randrange
cluster0Y = [0,1,0,1]
cluster1Y = [0,1,0,1]
while True:
        random_index = randrange(0,len(cluster0Y+cluster1Y))
        print(str(random_index))
        if random_index > len(cluster0Y):
            random_index = random_index - len(cluster0Y)
            if cluster1Y[random_index]==1:
                print('cluster 1 ' + str(random_index))
                break
        else:
            if cluster0Y[random_index]==1:
                print('cluster 0 ' + str(random_index))
                break
        print(str(random_index))

Sin embargo, este código a veces imprime valores que no son 1 en las listas. ¿Por qué es este el caso?

0
jdeo 30 oct. 2017 a las 22:54

4 respuestas

La mejor respuesta

Definitivamente está seleccionando valores que no son 1, pero no los imprime. Está imprimiendo los índices aleatorios que apuntan a valores que no son 1.

También puede repensar su lógica para que parezca más

extract the indices of 1 values in list0
extract the indices of 1 values in list1
pick a random option from the extracted indices

Algo en la línea de:

allOnes0 = [(ind, 0) for ind, v in enumerate(cluster0Y) if v == 1]
allOnes1 = [(ind, 1) for ind, v in enumerate(cluster1Y) if v == 1]
(index, clusterId) = random.choice(allOnes0 + allOnes1)

Donde clusterId te dice si el 1 aleatorio vino del grupo 0 o 1, y index te dice la posición del 1 en el grupo.

Lo cual es mucho más sencillo y mucho menos propenso a errores.

1
B.M. 30 oct. 2017 a las 20:14

Modifiqué un poco tu código. Lo cambié a >= porque de acuerdo con su código cuando random_index = 4, no satisfará la condición random_index > len(cluster0Y) y allí obtendrá un error de lista fuera de rango

from random import randrange
cluster0Y = [0,1,0,1]
cluster1Y = [0,1,0,1]
while True:
        random_index = randrange(0,len(cluster0Y+cluster1Y))
        if random_index >= len(cluster0Y):
            random_index = random_index - len(cluster0Y)
        if cluster1Y[random_index]==1:
            print('cluster 1 : ',random_index)
            break
        if cluster0Y[random_index]==1:
            print('cluster 0 : ',random_index)
            break
        print('random index = ',random_index)
0
yash 30 oct. 2017 a las 20:14

Creo que su código aquí es demasiado complicado para lo que está tratando de lograr.

Puede usar algo como [idx for idx, val in enumerate(cluster) if val != 0] para encontrar los índices de elementos distintos de cero e ir desde allí.

En cuanto a por qué imprime 0s algunas veces, creo que @MatsLindh encontró la razón.

0
Iosif Serafeimidis 30 oct. 2017 a las 20:11

Funciona como se espera aquí, pero debe corregir un error de uno a uno:

if random_index > len(cluster0Y):

.. esto fallará una lectura de cluster0Y más tarde si random_index tiene exactamente el tamaño len (cluster0Y).

if random_index >= len(cluster0Y):
0
MatsLindh 30 oct. 2017 a las 20:08