Одно горячее кодирование массива - PullRequest
0 голосов
/ 08 апреля 2019

Я работаю над проблемой классификации изображений, где я получил метки поезда в виде 1-D массива, например [1,2,3,2,2,2,4,4,3,1].Я использовал

train_y = []
for label in train_label:
    if label == 0:
        train_y.append([1,0,0,0])
    elif label == 1:
        train_y.append([0,1,0,0])
    elif label == 2:
        train_y.append([0,0,1,0])
    elif label == 3:
        train_y.append([0,0,0,1])

Также мне нужен len(one_hot_array) = set(train_labels), но это не очень хороший метод.Пожалуйста, порекомендуйте хороший метод для этого.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Всегда полезно использовать NumPy для массивов. np.unique() определяет метки, которые у вас есть в train_labels. ix - это массив индексов. np.nonzero() дает индексы train_lables, где train_labels == unique_tl[iy].

import numpy as np

train_labels = np.array([2,5,8,2,5,8])
unique_tl = np.unique(train_labels)

NL = len(train_labels)               # how many data , 6
nl = len(unique_tl)                  # how many labels, 3   
target = np.zeros((NL,nl),dtype=int)

for iy in range(nl):
    ix = np.nonzero(train_labels == unique_tl[iy]) 
    target[ix,iy] = 1

1010 * дает *

target
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1],
       [1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])

Я подумаю о возможности устранить цикл for.

Если [2,5,8] подразумевается как часть [0,1,2,3,4,5,6,7,8], то вы можете использовать этот ответ

0 голосов
/ 08 апреля 2019

сделать вектор из нулей и установить только одно значение в 1

target = np.zeros(num_classes)
target[label] = 1
train_y.append(target)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...