2017-01-18 12 views
2

У меня есть огромный набор учебных материалов с 4 классами. Эти классы помечены не последовательно. Чтобы иметь возможность применять последовательную нейронную сеть, классы должны быть перемаркированы, чтобы уникальные значения в классах были последовательными. Кроме того, в конце сценария я должен переложить их обратно на свои старые значения.Векторизованная перемаркировка массива NumPy для последовательных чисел и возврат назад

Я знаю, как переименуйте их с петлями:

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

ответ

5

Мы можем использовать дополнительный аргумент return_inverse с np.unique, чтобы получить эти уникальные последовательные идентификаторы/теги , как так -

индекс
unq_arr, unq_tags = np.unique(old_classes,return_inverse=1) 

в unq_arr с unq_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]) 
+0

Но я могу также использовать это, чтобы переименуйте их обратно к старым ценностям? –

+0

@WilmarvanOmmeren Вы попробовали? Это будет перемаркироваться так же, как и то, что вы проявляете с помощью функции 'relabel', если вы не говорите о каком-то другом переклассификации? – Divakar

+0

Да, это будет работать, когда я переместлю их из последовательных последовательных. Но не тогда, когда я хочу переделать их обратно к их старым значениям (таким образом последовательный к нескончаемому). Соррр, я расширил свой пример, чтобы быть более ясным! –