如何将概率列表转换为二进制值

时间:2019-05-09 18:55:38

标签: python pandas numpy

我在NumPy数组中存储了一个介于0和1之间的概率列表。我该如何隐瞒这些值,以使任何> 0.5的值变为1而任何<0.5的值变为0?

我所拥有的基本上是:

    model = [0.123,0.789,0.456,0.654]  

我想要的是:

    model = [0,1,0,1]

这只是将整个数组更改为1s,我也尝试过

我尝试使用循环来实现:

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

这只是将整个数组更改为1s,我也尝试过

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 个答案:

答案 0 :(得分:3)

没有任何其他库,您可以选择...

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

答案 1 :(得分:2)

按如下所示使用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)

答案 2 :(得分:1)

您的第一个示例不起作用,因为您没有评估model数组(model[i])的值,而是评估了迭代器的索引(i

您的第二个示例不起作用,因为i + 1实际上并没有更改i的值。您想要的是:i += 1

第二个示例中还有一个细微的错误,即精确地0.5的值将保持不变,我认为这是不需要的。

您可以使用Python的enter image description here语法轻松地将数组转换为所需的格式:

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

答案 3 :(得分:0)

使用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])

答案 4 :(得分:0)

只需使用numpy.round函数

import numpy as np
model = np.round(model)