Asigna un conjunto de cadenas NumPy a enteros

Problema:

Dada una matriz de datos de cadena

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

Me gustaría una función que devuelva el conjunto de datos indexados

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

y una tabla de búsqueda

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

tal que

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

es verdad. Tenga en cuenta que elindexed_dataSet ylookupTable ambos pueden permutarse de manera tal que lo anterior se cumpla y eso está bien (es decir, no es necesario que el orden delookupTable es equivalente al orden de la primera aparición endataSet)

Solución lenta

Actualmente tengo la siguiente solución lenta

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

¿Hay una manera más rápida de hacer esto? Siento que no estoy usando numpy en todo su potencial aquí.

Respuestas a la pregunta(2)

Su respuesta a la pregunta