【问题标题】:Convert NumPy array to 0 or 1 based on threshold根据阈值将 NumPy 数组转换为 0 或 1
【发布时间】:2018-02-23 03:41:32
【问题描述】:

我在下面有一个数组:

a=np.array([0.1, 0.2, 0.3, 0.7, 0.8, 0.9])

我想要的是将此向量转换为基于阈值的二进制向量。 以threshold=0.5为例,大于0.5的元素转换为1,否则为0。
输出向量应该是这样的:

a_output = [0, 0, 0, 1, 1, 1]

我该怎么做?

【问题讨论】:

标签: python arrays numpy


【解决方案1】:

np.where

np.where(a > 0.5, 1, 0)
# array([0, 0, 0, 1, 1, 1])

使用astype 进行布尔运算

(a > .5).astype(int)
# array([0, 0, 0, 1, 1, 1])

np.select

np.select([a <= .5, a>.5], [np.zeros_like(a), np.ones_like(a)])
# array([ 0.,  0.,  0.,  1.,  1.,  1.])

特殊情况:np.round

如果您的数组值是介于 0 和 1 之间的浮点值并且您的阈值为 0.5,这是最佳解决方案。

a.round()
# array([0., 0., 0., 1., 1., 1.])

【讨论】:

  • 使用 dtype 'uint8' 最快的是哪一个? np.select 方法默认返回一个 'uint8' 但看起来更复杂。
  • 如果你想得到一个 dtype 'bool' 的 Numpy 数组,那么 a &gt; 0.5 会给你。
  • @user3613932 我不久前写了这个答案,但如果我没记错的话,你可以得到一个带有 > .5 的布尔掩码,然后调用 .view 将视图更改为 uint8,这应该会更快比 astype... 看看,如果它不起作用,请告诉我。
  • 基于official documentation 不确定viewastype 相比有多安全。 astype 创建一个新副本,而 view 利用原始变量的内存。
【解决方案2】:

您可以使用sklearn.preprocessing module 中的binarize

但是,这仅在您希望最终值是二进制的情况下才有效,即“0”或“1”。上面提供的答案也非常适合非二进制结果。

from sklearn.preprocessing import binarize

a = np.array([0.1, 0.2, 0.3, 0.7, 0.8, 0.9]).reshape(1,-1)
x = binarize(a) 
a_output = np.ravel(x)
print(a_output) 

#everything together 
a_output = np.ravel(binarize(a.reshape(1,-1), 0.5))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 2018-04-12
    • 2018-03-12
    • 2012-10-07
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多