Вы можете использовать поисковый словарь:
# example data
# this is the full list including unobserved levels
av = list(map(chr, range(ord('a'), ord('z')+1)))
lookup = { v : i for i, v in enumerate(av)}
# this is the vector to apply ohe
v = ['a', 'f', 'u']
# apply one hot encoding
ohe = np.zeros((len(v), len(av)))
for i in range(len(v)):
ohe[i, lookup[v[i]]] = 1
Сложность .index
заключается в O(n)
против поиска в словаре, который O(1)
. Вы даже можете сохранить цикл for, выполнив:
indices = [lookup[vi] for vi in v]
ohe = np.zeros((len(v), len(av)))
ohe[np.arange(len(v)), indices] = 1