Tengo una lista de probabilidades entre 0 y 1 almacenadas en una matriz NumPy. ¿Cómo puedo convertir estos valores para que cualquier valor> 0.5 se convierta en 1 y cualquier <0.5 se convierta en 0?

Lo que tengo es básicamente:

    model = [0.123,0.789,0.456,0.654]  

Y lo que quiero es:

    model = [0,1,0,1]

Esto solo cambia toda la matriz a 1s y también intenté

He intentado hacerlo usando bucles:

for i in range(len(model)):
if i<0.5:
    model[i]=0
elif i>0.5:
    model[i]=1

Esto solo cambia toda la matriz a 1s y también intenté

i = 0
while i <len(model):
    if model[i] < 0.5:
        model[i] = 0
        i + 1
    elif model[i] >0.5:
        model[i] = 1
        i + 1

Pero eso tampoco funcionó.

0
JaredS 9 may. 2019 a las 21:55

5 respuestas

La mejor respuesta

Su primer ejemplo no funciona porque no está evaluando los valores de la matriz model (model[i]), está evaluando los índices del iterador (i).

Su segundo ejemplo no funciona porque i + 1 en realidad no cambia el valor de i. Lo que quieres es: i += 1.

También hay un error sutil en su segundo ejemplo, a saber, que un valor de exactamente 0.5 no cambiará, lo que supongo que no se desea.

Puede usar la sintaxis comprensión de la lista de Python para convertir fácilmente la matriz al formato que desee. querer:

model = [random.random() for _ in range(5)]
model = [1 if n >= 0.5 else 0 for n in model]

De lo contrario, aquí hay un bucle tradicional que hace lo mismo:

for i in range(len(model)):
    if model[i] < 0.5:
        model[i] = 0
    else:
        model[i] = 1
1
Colin Basnett 9 may. 2019 a las 19:05

Simplemente use la función numpy.round

import numpy as np
model = np.round(model)
0
Mr Morgan 9 may. 2019 a las 19:06

Utilice np.vectorize función:

model = np.array([0.123,0.789,0.456,0.654], dtype='float')
np.vectorize(lambda x: int(x >= 0.5))(model)

Volverá:

array([0, 1, 0, 1])

0
vurmux 9 may. 2019 a las 19:00

Utilice np.where de la siguiente manera:

list(np.where(np.array(model) > 0.5, 1, 0 ))

Además, una simple comparación de% timeit de todo lo anterior / inferior:

In [24]: %timeit np.round(model)                                                                                                                     
12.9 µs ± 69.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [25]: %timeit list(np.where(np.array(model) > 0.5, 1, 0 ))                                                                                        
10.7 µs ± 26.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [26]: %timeit [int(i > .5) for i in model]                                                                                                        
1.28 µs ± 5.02 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
2
hacker315 9 may. 2019 a las 19:19

Sin bibliotecas adicionales, podría ir con ...

model = [int(i > .5) for i in model]
4
Chris Farr 9 may. 2019 a las 19:04