Как превратить список вероятностей в двоичные значения - PullRequest
0 голосов
/ 09 мая 2019

У меня есть список вероятностей от 0 до 1, хранящийся в массиве NumPy. Как я могу скрыть эти значения, чтобы любые значения> 0,5 стали 1, а любые <0,5 стали 0? </p>

Что у меня есть в основном:

    model = [0.123,0.789,0.456,0.654]  

и что я хочу это:

    model = [0,1,0,1]

Это просто изменяет весь массив на 1 с, и я также пытался

Я пытался сделать это с помощью циклов:

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

Это просто изменяет весь массив на 1 с, и я также пытался

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

но это тоже не сработало.

Ответы [ 5 ]

3 голосов
/ 09 мая 2019

Без каких-либо дополнительных библиотек вы могли бы пойти с ...

model = [int(i > .5) for i in model]
2 голосов
/ 09 мая 2019

Используйте np.where следующим образом:

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

Также, простое сравнение% timeit всех выше / ниже:

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)
1 голос
/ 09 мая 2019

Ваш первый пример не работает, потому что вы не оцениваете значения массива model (model[i]), вы оцениваете индексы итератора (i).

Ваш второй пример не работает, потому что i + 1 фактически не меняет значение i. То, что вы хотите: i += 1.

В вашем втором примере также есть небольшая ошибка, а именно, что значение 0.5 останется неизменным, что, я полагаю, не требуется.

Вы можете использовать синтаксис списка Python , чтобы легко преобразовать массив в нужный вам формат:

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

В противном случае, есть традиционный цикл, который делает то же самое:

for i in range(len(model)):
    if model[i] < 0.5:
        model[i] = 0
    else:
        model[i] = 1
0 голосов
/ 09 мая 2019

Просто используйте numpy.round функцию

import numpy as np
model = np.round(model)
0 голосов
/ 09 мая 2019

Использование np.vectorize Функция:

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

вернет:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...