2
votes

Comment transformer une liste de probabilités en valeurs binaires

J'ai une liste de probabilités entre 0 et 1 stockées dans un tableau NumPy. Comment puis-je convertir ces valeurs pour que toute valeur> 0,5 devienne 1 et toute valeur Ce que j'ai, c'est essentiellement:

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

et ce que je veux c'est :

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

Cela change simplement le tableau entier en 1 et j'ai aussi essayé

J'ai essayé de le faire en utilisant des boucles:

    model = [0,1,0,1]

Cela change simplement le tableau entier en 1 et j'ai aussi essayé

    model = [0.123,0.789,0.456,0.654]  

mais cela n'a pas fonctionné non plus.

p>


2 commentaires

liste (carte (lambda x: int (x> 0.5), modèle))


peut-être utiliser np.round ?


5 Réponses :


0
votes

Utilisez np. fonction vectoriser :

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

retournera:

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


0 commentaires

4
votes

Sans aucune bibliothèque supplémentaire, vous pouvez utiliser ...

model = [int(i > .5) for i in model]


0 commentaires

2
votes

Votre premier exemple ne fonctionne pas car vous n'évaluez pas les valeurs du tableau model ( model [i] ), vous évaluez les indices de l'itérateur ( i ).

Votre deuxième exemple ne fonctionne pas car i + 1 ne change pas réellement la valeur de i . Ce que vous voulez, c'est: i + = 1 .

Il y a aussi une erreur subtile dans votre deuxième exemple, à savoir qu'une valeur d'exactement 0,5 sera inchangé, ce que je suppose n'est pas souhaité.

Vous pouvez utiliser le de Python syntaxe de compréhension de liste pour convertir facilement le tableau au format souhaité:

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

Sinon, voici une boucle traditionnelle qui fait la même chose:

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


0 commentaires


3
votes

Utilisez np.where comme suit:

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

Aussi, une simple comparaison% timeit de tout ce qui est ci-dessus / ci-dessous:

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)


0 commentaires