Keras一键编码器

时间:2018-11-18 16:43:02

标签: python numpy keras one-hot-encoding

我有一个数组,并在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,另一个代表7。

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

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或类似工具中的某些“隐藏”功能?

2 个答案:

答案 0 :(得分:2)

np.uniquereturn_inverse标志一起使用-

# 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.]])

答案 1 :(得分:2)

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)