我在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
但是那也不起作用。
答案 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
的值将保持不变,我认为这是不需要的。
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)