У меня есть массив 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)
unique_values
,col
? - person Divakar   schedule 12.10.2017