“尾随”一热编码

时间:2015-07-21 00:15:24

标签: python numpy

我正在尝试做类似于One-Hot-Encoding的事情,但是不是选择的类是1而其余的是0,我希望所有类(包括选定的类)都是1.说我有带有标签的培训批次(5个可能的类别标签; 0,1,2,3,4)

y = np.array([0,2,1,3,4,1])

我可以用

进行热编码
def one_hot_encode(arr, num_classes):
    return np.eye(num_classes)[arr]

给出了

>>> one_hot_encode(y, 5)
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  0.,  0.]])

我喜欢

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

任何人都知道怎么做?

2 个答案:

答案 0 :(得分:2)

您可以通过在函数定义中使用低三角矩阵而不是单位矩阵来实现此目的:

def many_hot_encode(arr, num_classes):
    return np.tril(np.ones(num_classes))[arr]

many_hot_encode(y,5)
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  0.,  0.],
       [ 1.,  1.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  0.,  0.,  0.]])

答案 1 :(得分:1)

您还可以使用broadcasting -

out = (y[:,None] >= np.arange(num_classes)).astype(float)

示例运行 -

In [71]: y = np.array([0,2,1,3,4,1])

In [72]: num_classes = 5

In [73]: (y[:,None] >= np.arange(num_classes)).astype(float)
Out[73]: 
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  0.,  0.],
       [ 1.,  1.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  0.,  0.,  0.]])