Векторизация двумерного массива символов по столбцам - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть двумерный массив, как показано ниже:

a=np.array([["Science", "Blue", 3],
            ["Math", "Red", 4],
            ["Math", "Red", 5],
            ["Science", "Red", 3]])

И мне нужно преобразовать его в столбец числовых значений, как показано ниже (желаемый вывод):

out=np.array([[0, 0, 0],
              [1, 1, 1],
              [1, 1, 2], 
              [0, 1, 0]])

Тем не менее, для дальнейшей интерпретации, мне также нужно иметь вывод для трассировки от числовых значений к исходным значениям. Я думал что-то вроде этого:

trace_back_dict = {0: {0: "Science", 1: "Math"}, 
                   1: {0: "Blue", 1: "Red"}, 
                   2: {0: 3, 1: 4, 2: 5}}

Где внешние ключи - это индексы столбцов из исходного массива, а внутренние диктанты отображают числовое значение: символьное значение.

Есть ли простой способ сделать это, предпочтительно что-то в стиле sklearn, где я могу сделать fit_transform, а затем transform (для целей обучения и тестирования)?

Я смотрел на sklearn LabelEncoder, и, по сути, мне нужно применить разные значения для каждого столбца. Любые предложения о том, как сделать это эффективно?

Спасибо!

Jack

1 Ответ

0 голосов
/ 04 ноября 2018

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

In [25]: a = [['Science', 'Blue', 3], ['Math', 'Red', 4], ['Math', 'Red', 5], ['Science', 'Red', 3]]

In [26]: enc = sklearn.preprocessing.OrdinalEncoder()

In [27]: enc.fit(a)
Out[27]: OrdinalEncoder(categories='auto', dtype=<class 'numpy.float64'>)

In [28]: enc.transform(a)
Out[28]: 
array([[1., 0., 0.],
       [0., 1., 1.],
       [0., 1., 2.],
       [1., 1., 0.]])

In [29]: enc.categories_
Out[29]: 
[array(['Math', 'Science'], dtype=object),
 array(['Blue', 'Red'], dtype=object),
 array([3, 4, 5], dtype=object)]

In [30]: trace_back_dict = {i: dict(enumerate(v)) for i, v in enumerate(enc.categories_)}

In [31]: trace_back_dict
Out[31]: {0: {0: 'Math', 1: 'Science'}, 1: {0: 'Blue', 1: 'Red'}, 2: {0: 3, 1: 4, 2: 5}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...