Я работаю над проблемой классификации изображений, в которой я получил метки поезда в виде 1-мерного массива, например [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
Soum 8 Апр 2019 в 20:56

2 ответа

Лучший ответ

Это всегда хорошая привычка использовать numpy для массива. {{0}} определить метки, которые есть у вас в 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

Дает

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

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

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

1
pyano 8 Апр 2019 в 20:05

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

target = np.zeros(num_classes)
target[label] = 1
train_y.append(target)
0
blue_note 8 Апр 2019 в 17:58