Список строк для числовых меток - PullRequest
0 голосов
/ 05 июля 2018

У меня есть список строк, и мне нужно преобразовать его в список числовых меток. Пример:

x= ['hello', 'John', 'hi', 'John', 'hello', 'pumpum']
# output should be something like this:
y=[0, 1, 2, 1, 0, 3]

NB. Список содержит 100 тыс. Строк, и я читаю его из файла.

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Если вы счастливы использовать стороннюю библиотеку, вы можете использовать numpy.unique:

import numpy as np

x = ['hello', 'John', 'hi', 'John', 'hello', 'pumpum']

vals, ids, idx = np.unique(x, return_index=True, return_inverse=True)

print(idx)

array([1, 0, 2, 0, 1, 3], dtype=int64)
0 голосов
/ 05 июля 2018

Если у вас большой массив, то sklearn имеет оптимизированный метод для этого, используя LabelEncoder:

In[124]:
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
x= ['hello', 'John', 'hi', 'John', 'hello', 'pumpum']
le.fit(x)
y = le.transform(x)
y

Out[124]: array([1, 0, 2, 0, 1, 3], dtype=int64)

Возвращает пустой массив, из которого вы можете выполнять другие операции, и совместим со стеком scipy

.
0 голосов
/ 05 июля 2018

Вот краткое решение с промежуточным словарем:

x = ['hello', 'John', 'hi', 'John', 'hello', 'pumpum']

d = dict(zip(set(x),range(len(set(x)))))
y = [d[i] for i in x]

print(y)  # [2, 1, 0, 1, 2, 3]

Примечание: это работает, если вам не нужно упорядочивать числовые метки, т. Е. Если вам не нужно связывать 0 с первым элементом в x, 1 со вторым элементом в x и т. Д. ...

РЕДАКТИРОВАТЬ после комментария от Патрика Артнера :
Он предлагает предварительно вычислить набор и сохранить его как собственную переменную для оптимизации, и он прав. Вот обновленный код:

x = ['hello', 'John', 'hi', 'John', 'hello', 'pumpum']

s = set(x)
d = dict(zip(s,range(len(s))))
y = [d[i] for i in x]

print(y)  # [2, 1, 0, 1, 2, 3]
0 голосов
/ 05 июля 2018

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

d = {}
x= ['hello', 'John', 'hi', 'John', 'hello', 'pumpum']
count = 0
for i in x:
  if i not in d:
     d[i] = count
     count += 1

new_x = [d[i] for i in x]

Выход:

[0, 1, 2, 1, 0, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...