numpy преобразовывают категориальные массивы строк в целочисленный массив

Я пытаюсь преобразовать массив строк категориальных переменных к целочисленному массиву категориальных переменных.

Напр.

import numpy as np
a = np.array( ['a', 'b', 'c', 'a', 'b', 'c'])
print a.dtype
>>> |S1

b = np.unique(a)
print b
>>>  ['a' 'b' 'c']

c = a.desired_function(b)
print c, c.dtype
>>> [1,2,3,1,2,3] int32

Я понимаю, что это может быть сделано с циклом, но я предполагаю, что существует более легкий путь.Спасибо.

14
задан wroscoe 3 July 2010 в 18:53
поделиться

3 ответа

Что ж, это уловка ... но помогает ли это?

In [72]: c=(a.view(np.ubyte)-96).astype('int32')

In [73]: print(c,c.dtype)
(array([1, 2, 3, 1, 2, 3]), dtype('int32'))
1
ответ дан 1 December 2019 в 05:48
поделиться

Один из способов - использовать функцию categorical из scikits.statsmodels. Например:

In [60]: from scikits.statsmodels.tools import categorical

In [61]: a = np.array( ['a', 'b', 'c', 'a', 'b', 'c'])

In [62]: b = categorical(a, drop=True)

In [63]: b.argmax(1)
Out[63]: array([0, 1, 2, 0, 1, 2])

Возвращаемое значение из categorical (b) на самом деле является матрицей проектирования, поэтому для приведения ее к желаемому формату необходимо вызвать argmax.

In [64]: b
Out[64]:
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
18
ответ дан 1 December 2019 в 05:48
поделиться

np.unique имеет некоторые опциональные возвраты

return_inverse дает целочисленную кодировку, которую я использую очень часто

>>> b, c = np.unique(a, return_inverse=True)
>>> b
array(['a', 'b', 'c'], 
      dtype='|S1')
>>> c
array([0, 1, 2, 0, 1, 2])
>>> c+1
array([1, 2, 3, 1, 2, 3])

ее можно использовать для воссоздания исходного массива из uniques

>>> b[c]
array(['a', 'b', 'c', 'a', 'b', 'c'], 
      dtype='|S1')
>>> (b[c] == a).all()
True
39
ответ дан 1 December 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: