Я пытаюсь преобразовать массив строк категориальных переменных к целочисленному массиву категориальных переменных.
Напр.
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
Я понимаю, что это может быть сделано с циклом, но я предполагаю, что существует более легкий путь.Спасибо.
Что ж, это уловка ... но помогает ли это?
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'))
Один из способов - использовать функцию 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.]])
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