python — как сопоставить массив целого числа с другим целым числом

#python

#питон

Вопрос:

Я делаю проект CNN, и сначала мне нужно предварительно обработать метку.

Файл изображения представляет собой спектрограмму, каждый файл имеет метку из 250 значений, хранящихся в массиве. Он сообщает последовательность значений высоты тона, присутствующих в конкретной спектрограмме. Например, один файл ярлыка выглядит следующим образом:

 [ 0  0  0  0  0  0  0  0  0  0  0 57 57 57 57 57 57 57 57 58 58 57 57 57
  0  0  0  0  0 56 57 57 56 56 56 56 56 56 56 56 56 57 57 58 59 61 62 62
 63 64 64 63 64 64 64 64  0  0  0  0 64 64 64 64 63 63 63 63 63 64 63 64
 64 64 65 66 66 66 66 66 65 65 66 66 66 66 65  0  0  0  0 65 65 65 66 66
 66 66 66 65 65 65  0  0  0  0 64 64 64 64 64 64 64 64 64 64 64 64 64 64
 63  0  0  0  0  0  0  0  0  0  0  0  0  0 60 60 60 60 61 61 62 62 62 62
 62 62 62 61  0  0  0 62 62 62 62 62 62 62 62 62 62 62 62 60  0 62 61 60
 61 61 61 61 61 61 61 61 61 60  0  0  0  0  0 61 60 60 60 61 61 61 61 61
 61  0  0  0  0  0  0 59 59 59 59 58 58 59 59 59 59  0  0  0  0  0  0  0
 59 59 58 58 59 59 59 59 59 59  0  0  0  0 58 57 57 57 57 57 57 57 57 57
 57 57 58 57  0  0  0  0  0  0]
 

После того, как я суммирую все файлы меток, я обнаружил, что эти 51 уникальные значения присутствуют в этих метках. Я сохранил эти значения в массиве.

 y_train = # y_test also contains these values
[ 0 30 31 32 33 34 35 36 37 38 
 39 40 41 42 43 44 45 46 47 48 
 49 50 51 52 53 54 55 56 57 58 
 59 60 61 62 63 64 65 66 67 68 
 69 70 71 72 73 74 76 77 81 83 
 85]
 

Мне нужно выполнить to_categorical метод для определения номера класса (в моем случае 51), прежде чем я смогу выполнить вычисление CNN. Вы можете посмотреть to_categorical документы здесь.

Я сделал это, но результат равен 86, а не 51. Я предполагаю, потому что моя метка уже в целочисленном формате, и метод считает, что у меня есть 86 уникальных значений в диапазоне от 0 до 85 в полном порядке, в то время как на самом деле у меня есть только 51 уникальное значение в диапазоне от 0 до 85, но не в полном порядке (см. y_train ).

 # convert to array first. y_train and y_test are labels for an image X_train and X_test.
y_train = np.array(y_train) # labels for X_train images
y_test = np.array(y_test) # labels for X_test images

# do to_categorical
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

# shape result
y_train:  (638, 250, 86) # 638 = total data, 250 = 1 data length, 86 = num_class
y_test:  (161, 250, 86) # 161 = total data, 250 = 1 data length, 86 = num_class
 

Затем мне приходит в голову идея сопоставить все уникальные значения с новым целым числом, чтобы to_categorical метод make думал, что у меня есть только 51 класс, пример:

 0 -> 0
30 -> 1
31 -> 2
32 -> 3
...
85 -> 51
 

Есть ли в Python способ добиться такого сопоставления из y_train массива? И если есть, могу ли я вернуть его обратно к исходному значению, когда вычисление будет завершено? Спасибо.

Ответ №1:

Да, вы можете создать словарь всех этих сопоставлений, как показано ниже

 map_dict = {}

for i, value in enumerate(y_train):
    map_dict[i] = value
 

Вашими новыми категориями будут ключи map_dict, которые вы можете получить, как показано ниже

 list(map_dict.keys())
 

Позже, когда вам придется возвращаться к исходным значениям, вам просто нужно проверить map_dict, например

  map_dict[k]
 

Для печати как ключей, так и значения в словаре, выполните следующие действия,

  for key, value in map_dict.items():
     print(key, ' --->', value)
 

Комментарии:

1. Спасибо! 1 вопрос, могу ли я также распечатать dict с его ключом и значением?

2. @DionisiusPratama Да, конечно, я отредактирую свой ответ, чтобы показать вам, как печатать