将NumPy数组的矢量化重新标记为连续数并重新检索

时间:2017-01-18 08:57:00

标签: python performance numpy classification vectorization

我有一个包含4个班级的庞大训练数据集。这些类是非连续标记的。为了能够应用顺序神经网络,必须重新标记类,以便类中的唯一值是连续的。另外,在脚本的最后,我必须将它们重新标记回原来的值。

我知道如何用循环重新标记它们:

def relabel(old_classes, new_classes):
    indexes=[np.where(old_classes ==np.unique(old_classes)[i]) for i in range(len(new_classes))]
    for i in range(len(new_classes )):
        old_classes [indexes[i]]=new_classes[i]
    return old_classes

>>> old_classes = np.array([0,1,2,6,6,2,6,1,1,0])
>>> new_classes = np.arange(len(np.unique(old_classes)))
>>> relabel(old_classes,new_classes)
array([0, 1, 2, 3, 3, 2, 3, 1, 1, 0])

但这不是很好的编码,而且需要花费很多时间。

知道如何对这种重新标记进行矢量化吗?

要明确的是,我也希望能够将它们重新标记回旧的价值观:

>>> relabeled_classes=np.array([0, 1, 2, 3, 3, 2, 3, 1, 1, 0])
>>> old_classes = np.array([0,1,2,6])
>>> relabel(relabeled_classes,old_classes )
array([0,1,2,6,6,2,6,1,1,0])

1 个答案:

答案 0 :(得分:5)

我们可以将可选参数return_inversenp.unique一起使用来获取这些唯一的顺序ID /标记,如下所示 -

unq_arr, unq_tags = np.unique(old_classes,return_inverse=1)

使用unq_arrunq_tags索引回来 -

old_classes_retrieved = unq_arr[unq_tags] 

示例运行 -

In [69]: old_classes = np.array([0,1,2,6,6,2,6,1,1,0])

In [70]: unq_arr, unq_tags = np.unique(old_classes,return_inverse=1)

In [71]: unq_arr
Out[71]: array([0, 1, 2, 6])

In [72]: unq_tags
Out[72]: array([0, 1, 2, 3, 3, 2, 3, 1, 1, 0])

In [73]: old_classes_retrieved = unq_arr[unq_tags]

In [74]: old_classes_retrieved
Out[74]: array([0, 1, 2, 6, 6, 2, 6, 1, 1, 0])