Горячее кодирование списка символов с ненаблюдаемыми уровнями - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь создать одну горячую кодировку (ohe) списка символов с учетом ненаблюдаемых уровней. Использование ответов из Преобразование массива индексов в массив NumPy с горячим кодированием и Нахождение индекса элемента по списку, содержащему его в Python , следующее хочет, чтобы я хотел:

# example data
# this is the full list including unobserved levels
av = list(map(chr, range(ord('a'), ord('z')+1))) 
# 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, av.index(v[i])] = 1
ohe

Есть ли более стандартный / более быстрый способ сделать это, отметив, что во второй ссылке выше упоминается узкое место .index().

(масштаб моей проблемы: полный вектор (av) имеет ~ 1000 уровней, а значения ohe (v) имеют длину 0,5M. Спасибо.

1 Ответ

1 голос
/ 14 октября 2019

Вы можете использовать поисковый словарь:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...