быстрое кодирование и существующие данные

У меня есть массив numpy (N, M), где некоторые столбцы должны быть закодированы в горячем режиме. Пожалуйста, помогите сделать горячую кодировку с использованием numpy и / или tenorflow.

Пример:

[
[ 0.993, 0, 0.88 ]
[ 0.234, 1, 1.00 ]
[ 0.235, 2, 1.01 ]
.....
]

Второй столбец здесь (со значениями 3 и 2) должен быть одним горячим кодированием, я знаю, что есть только 3 различных значения (0, 1, 2).

Результирующий массив должен выглядеть так:

[
[ 0.993, 0.88, 0, 0, 0 ]
[ 0.234, 1.00, 0, 1, 0 ]
[ 0.235, 1.01, 1, 0, 0 ]
.....
]

Таким образом, я мог бы передать этот массив в тензорный поток. Обратите внимание, что 2-й столбец был удален, и его горячая версия была добавлена ​​в конец каждого подмассива.

Любая помощь будет высоко ценится. Заранее спасибо.

Обновление:

Вот что у меня есть прямо сейчас: Ну, не совсем ... 1. У меня более 3 столбцов в массиве ... но я все еще хочу сделать это только со 2-м .. 2. Первый массив структурирован, т.е. форма (N,)

Вот что у меня есть:

def one_hot(value, max_value):
    value = int(value)
    a = np.zeros(max_value, 'uint8')
    if value != 0:
        a[value] = 1
    return a

# data is structured array with the shape of (N,)
# it has strings, ints, floats inside..
# was get by np.genfromtxt(dtype=None)

unique_values = dict()
unique_values['categorical1'] = 1
unique_values['categorical2'] = 2
for row in data:
   row[col] = unique_values[row[col]]

codes = np.zeros((data.shape[0], len(unique_values)))

idx = 0
for row in data:
   codes[idx] = one_hot(row[col], len(unique_values))  # could be optimised by not creating new array every time
   idx += 1

data = np.c_[data[:, [range(0, col), range(col + 1, 32)]], codes[data[:, col].astype(int)]]

Также пытаюсь объединить через:

print data.shape # shape (5000,)
print codes.shape # shape (5000,3)
data = np.concatenate((data, codes), axis=1)

person user3489820    schedule 12.10.2017    source источник
comment
Второй столбец имел значения 0,1,2. Я не понимаю, как это создало заявленный массив с горячим кодированием. Может опечатка?   -  person Divakar    schedule 12.10.2017
comment
0 кодируется как 0, 0, 0. 1 кодируется как 0, 1, 0. 2 кодируется как 1, 0, 0   -  person user3489820    schedule 12.10.2017
comment
Мне не нужно иметь точное двоичное представление значений. Я имею в виду, что если 2 будет закодировано как 0, 0, 1 и 1 будет закодировано как 1, 0, 0, это тоже хорошо для меня, но я думаю, что 0 должен быть закодирован как 0, 0, 0.   -  person user3489820    schedule 12.10.2017
comment
Что unique_values, col?   -  person Divakar    schedule 12.10.2017
comment
col - индекс столбца, который я хочу изменить, т.е. удалить и преобразовать в один-горячий, добавив. unique_values ​​- словарь. Что-то вроде ['category_value_2'] = 2. Итак, длина этого словаря - это количество максимальных значений для one_hot.   -  person user3489820    schedule 12.10.2017
comment
Не могли бы вы добавить их в код для обновления. Всегда приятно видеть полную поддающуюся проверке рабочую версию кода с минимальным количеством данных для запуска.   -  person Divakar    schedule 12.10.2017


Ответы (1)


Вот один подход -

In [384]: a # input array
Out[384]: 
array([[ 0.993,  0.   ,  0.88 ],
       [ 0.234,  1.   ,  1.   ],
       [ 0.235,  2.   ,  1.01 ]])

In [385]: codes = np.array([[0,0,0],[0,1,0],[1,0,0]]) # define codes here

In [387]: codes
Out[387]: 
array([[0, 0, 0],   # encoding for 0
       [0, 1, 0],   # encoding for 1
       [1, 0, 0]])  # encoding for 2

# Slice out the second column and append one-hot encoded array
In [386]: np.c_[a[:,[0,2]], codes[a[:,1].astype(int)]]
Out[386]: 
array([[ 0.993,  0.88 ,  0.   ,  0.   ,  0.   ],
       [ 0.234,  1.   ,  0.   ,  1.   ,  0.   ],
       [ 0.235,  1.01 ,  1.   ,  0.   ,  0.   ]])
person Divakar    schedule 12.10.2017
comment
Допустим, у меня есть массив: [[0.993, 0, 0.88] [0.234, 1, 1.00] [0.235, 2, 1.01] [0.234, 0, 2.01] .....] Не могли бы вы включить динамическую генерацию кодов массив на основе исходного массива? - person user3489820; 12.10.2017
comment
@ user3489820 Должно работать все равно. Используйте это как новый a, и он будет работать без каких-либо изменений. - person Divakar; 12.10.2017
comment
Что ж, я считаю, что это помогло мне продвинуться дальше, но я все еще стекаю .. 1-й: у меня есть структурированный массив, то есть его форма (N,) 2-й: у меня гораздо больше 3 столбцов ... Пожалуйста, проверьте мой пост, чтобы увидеть где я сейчас нахожусь. Я отмечу вопрос как ответ, но буду благодарен, если вы поможете мне продвинуться еще дальше. - person user3489820; 12.10.2017