Сопоставить массив строк NumPy с целыми числами

Проблема:

Дан массив строковых данных

dataSet = np.array(['kevin', 'greg', 'george', 'kevin'], dtype='U21'), 

Я хотел бы функцию, которая возвращает индексированный набор данных

indexed_dataSet = np.array([0, 1, 2, 0], dtype='int')

и справочная таблица

lookupTable = np.array(['kevin', 'greg', 'george'], dtype='U21')

такой, что

(lookupTable[indexed_dataSet] == dataSet).all()

правда. Обратите внимание, чтоindexed_dataSet а такжеlookupTable оба могут быть переставлены так, чтобы вышеприведенное имело место, и это нормально (то есть нет необходимости, чтобы порядокlookupTable эквивалентно порядку первого появления вdataSet).

Медленное решение:

В настоящее время у меня есть следующее медленное решение

def indexDataSet(dataSet):
    """Returns the indexed dataSet and a lookup table
       Input:
           dataSet         : A length n numpy array to be indexed
       Output:
           indexed_dataSet : A length n numpy array containing values in {0, len(set(dataSet))-1}
           lookupTable     : A lookup table such that lookupTable[indexed_Dataset] = dataSet"""
    labels = set(dataSet)
    lookupTable = np.empty(len(labels), dtype='U21')
    indexed_dataSet = np.zeros(dataSet.size, dtype='int')
    count = -1
    for label in labels:
        count += 1
        indexed_dataSet[np.where(dataSet == label)] = count
        lookupTable[count] = label

    return indexed_dataSet, lookupTable

Есть ли более быстрый способ сделать это? Я чувствую, что я не использую NumPy в полном объеме здесь.

Ответы на вопрос(2)

Ваш ответ на вопрос