代码如下:
n_classes = 10
y = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
y_one_hot = (np.arange(n_classes) == y[:, None]).astype(np.float64)
其中用到的是numpy的广播机制和Boolean数组的转换
首先把y变成列矩阵
In [34]: y[:, None]
Out[34]:
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
np.arange(n_classes) == y[:, None]得到的是一个(10, 10)的bool矩阵
In [37]: np.arange(n_classes) == y[:, None]
Out[37]:
array([[ True, False, False, False, False, False, False, False, False,
False],
[False, True, False, False, False, False, False, False, False,
False],
[False, False, True, False, False, False, False, False, False,
False],
[False, False, False, True, False, False, False, False, False,
False],
[False, False, False, False, True, False, False, False, False,
False],
[False, False, False, False, False, True, False, False, False,
False],
[False, False, False, False, False, False, True, False, False,
False],
[False, False, False, False, False, False, False, True, False,
False],
[False, False, False, False, False, False, False, False, True,
False],
[False, False, False, False, False, False, False, False, False,
True]])
然后将矩阵转换为所需的float或int形式,即可得到one_hot形式的标签
In [42]: (np.arange(n_classes) == y[:, None]).astype(np.float64)
Out[42]:
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])