2010-07-03 22 views
11

我想將分類變量的字符串數組轉換爲分類變量的整數數組。numpy將分類字符串數組轉換爲整數數組

Ex。

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 

我意識到這可以用循環完成,但我想有一個更簡單的方法。謝謝。

回答

2

嗯,這是一個黑客......但它有幫助嗎?

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')) 
+9

你認真想添加的警告,這種方式只適用於長度爲1的字符串。 – smci 2013-07-23 12:23:39

17

一種方法是使用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]) 

categoricalb)的返回值實際上是一個設計矩陣,因此調用以上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.]]) 
+0

整潔而聰明。謝謝。 – unutbu 2010-07-10 11:34:04

24

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]) 

它可以用於重新創建從唯一身份原數組

>>> b[c] 
array(['a', 'b', 'c', 'a', 'b', 'c'], 
     dtype='|S1') 
>>> (b[c] == a).all() 
True 
19

......年後......

爲了完整(因爲這不是在答案中提到)和個人原因(我總是pandas進口在我的模塊,但不一定sklearn),這也與pandas.get_dummies()

import numpy as np 
import pandas 

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

In [2]: b = pandas.get_dummies(a) 

In [3]: b 
Out[3]: 
     a b c 
    0 1 0 0 
    1 0 1 0 
    2 0 0 1 
    3 1 0 0 
    4 0 1 0 
    5 0 0 1 

In [3]: b.values.argmax(1) 
Out[4]: array([0, 1, 2, 0, 1, 2]) 
+0

謝謝。終於找到了我正在尋找的答案。 – SeeTheC 2017-04-07 09:05:50

1

相當簡單另一種方法是使用熊貓factorize項映射到數字:

In [1]: import numpy as np 
In [2]: import pandas as pd 
In [3]: a = np.array(['a', 'b', 'c', 'a', 'b', 'c']) 
In [4]: a_enc = pd.factorize(a) 
In [5]: a_enc[0] 
Out[5]: array([0, 1, 2, 0, 1, 2]) 
In [6]: a_enc[1] 
Out[6]: array(['a', 'b', 'c'], dtype=object) 
0

...一些年過......

以爲我會爲了完整性提供一個純Python的解決方案:

def count_unique(a): 
    def counter(item, c=[0], items={}): 
     if item not in items: 
      items[item] = c[0] 
      c[0] += 1 
     return items[item] 
    return map(counter, a) 

a = [0, 2, 6, 0, 2] 
print count_unique(a) 
>> [0, 1, 2, 0, 1] 
相關問題