Keras 单热编码器

Keras one-hot-encoder

我有一个数组,在keras中使用to_categorical函数:

labels = np.array([1,7,7,1,7])
keras.utils.to_categorical(labels)

我收到这样的回复:

array([[0., 1., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 1.],
   [0., 0., 0., 0., 0., 0., 0., 1.],
   [0., 1., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 1.]], dtype=float32)

我怎样才能只得到两列? 1号1号,7号1号。

这是一种可能的方法,但不是很好的方法:

labels = np.delete(labels, np.s_[0:1], axis=1)
np.delete(labels, np.s_[1:6], axis=1)

给出:

array([[1., 0.],
       [0., 1.],
       [0., 1.],
       [1., 0.],
       [0., 1.]], dtype=float32)

有没有更好的方法来实现这个?最好通过 Keras utils 或类似工具中的某些 "hidden" 函数?

使用带有 return_inverse 标志的 np.unique -

# Get unique IDs mapped to each group of elements
In [73]: unql, idx = np.unique(labels, return_inverse=True)

# Perform outer comparison for idx against range of unique groups
In [74]: (idx[:,None] == np.arange(len(unql))).astype(float)
Out[74]: 
array([[1., 0.],
       [0., 1.],
       [0., 1.],
       [1., 0.],
       [0., 1.]])

或者直接使用唯一标签 -

In [96]: (labels[:,None] == np.unique(labels)).astype(float)
Out[96]: 
array([[1., 0.],
       [0., 1.],
       [0., 1.],
       [1., 0.],
       [0., 1.]])

IIUC,您可以通过 任何 具有以下值的列索引您的数组:

cat = keras.utils.to_categorical(labels)
>>> cat
array([[0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 0., 0., 0., 1.],
       [0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1.]])

# Select column if it has at least one value:
>>> cat[:,cat.any(0)]
array([[1., 0.],
       [0., 1.],
       [0., 1.],
       [1., 0.],
       [0., 1.]])

您也可以使用 pandas:

import pandas as pd
cat = pd.get_dummies(labels).values
>>> cat
array([[1, 0],
       [0, 1],
       [0, 1],
       [1, 0],
       [0, 1]], dtype=uint8)