繁体   English   中英

python - 如何将 integer 的 map 阵列连接到另一个 Z157DB7DF530023575515ZD366C9B672

[英]python - how to map array of integer to another integer

我在做一个CNN项目,需要先对label进行预处理。

图像文件是一个频谱图,每个文件都有一个 label 的 250 个值存储在一个数组中。 它讲述了特定频谱图中存在的一系列音高值。 例如,一个 label 文件如下所示:

[ 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]

在总结所有label 文件后,我发现这些标签中存在这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]

在进行 CNN 计算之前,我需要执行to_categorical方法来确定 class 编号(在我的情况下为 51)。 您可以在此处查看to_categorical文档。

我已经完成了,但结果是 86,而不是 51。我假设是因为我的 label 已经是 integer 格式,并且该方法认为我有 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

然后,我想出了一个想法,将 map 的所有唯一值放入一个新的 integer 以使to_categorical方法认为我只有 51 个 class,例如:

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

Python 有没有办法从y_train数组实现这种映射? 如果有,我可以在计算完成后将其恢复为原始值吗? 谢谢你。

是的,您可以制作所有这些映射的字典,如下所示

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM