Керас горячего кодирования - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть массив, и я использую функцию 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 или подобных?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

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)
0 голосов
/ 18 ноября 2018

Использование np.unique с флагом return_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.]])
...