2017-08-17 38 views
2

我需要將單熱編碼轉換爲由唯一整數表示的類別。用下面的代碼創建的,因此一個熱編碼:Scikit:將單熱編碼轉換爲整數編碼

from sklearn.preprocessing import OneHotEncoder 
enc = OneHotEncoder() 
labels = [[1],[2],[3]] 
enc.fit(labels) 
for x in [1,2,3]: 
    print(enc.transform([[x]]).toarray()) 

Out: 
[[ 1. 0. 0.]] 
[[ 0. 1. 0.]] 
[[ 0. 0. 1.]] 

可以轉換回一組唯一的整數,例如:

[1,2,3]或[11,37,45 ]或其他每個整數唯一代表一個類的其他任何其他類。

是否可以使用scikit-learn或任何其他python庫?

*更新*

試過:

labels = [[1],[2],[3], [4], [5],[6],[7]] 
enc.fit(labels) 

lst = [] 
for x in [1,2,3,4,5,6,7]: 
    lst.append(enc.transform([[x]]).toarray()) 
lst 
Out: 
[array([[ 1., 0., 0., 0., 0., 0., 0.]]), 
array([[ 0., 1., 0., 0., 0., 0., 0.]]), 
array([[ 0., 0., 1., 0., 0., 0., 0.]]), 
array([[ 0., 0., 0., 1., 0., 0., 0.]]), 
array([[ 0., 0., 0., 0., 1., 0., 0.]]), 
array([[ 0., 0., 0., 0., 0., 1., 0.]]), 
array([[ 0., 0., 0., 0., 0., 0., 1.]])] 


a = np.array(lst) 
np.where(a==1)[1] 
Out: 
array([0, 0, 0, 0, 0, 0, 0], dtype=int64) 

不是我所需要

回答

1

你可以做到這一點使用np.where如下:

import numpy as np 
a=np.array([[ 0., 1., 0.], 
      [ 1., 0., 0.], 
      [ 0., 0., 1.]]) 
np.where(a==1)[1] 

這將打印array([1, 0, 2], dtype=int64) 。這是因爲np.where(a==1)[1]返回1的列索引,這正是標籤。

另外,由於a0,1-matrix,所以您也可以用np.where(a)[1]替代np.where(a==1)[1]

更新:以下解決方案應該與你的工作格式:

l=[np.array([[ 1., 0., 0., 0., 0., 0., 0.]]), 
np.array([[ 0., 0., 1., 0., 0., 0., 0.]]), 
np.array([[ 0., 1., 0., 0., 0., 0., 0.]]), 
np.array([[ 0., 0., 0., 0., 1., 0., 0.]]), 
np.array([[ 0., 0., 0., 0., 1., 0., 0.]]), 
np.array([[ 0., 0., 0., 0., 0., 1., 0.]]), 
np.array([[ 0., 0., 0., 0., 0., 0., 1.]])] 
a=np.array(l) 

np.where(a)[2] 

這將打印

array([0, 2, 1, 4, 4, 5, 6], dtype=int64) 

Alternativaly,你可以用@ ml4294的評論一起使用原來的解決方案。

+0

對於其他數組長度不起作用。請參閱我的更新問題 – dokondr

+0

您構建了(實際上)一維數組的列表,而不是二維numpy數組。 – ml4294

+0

@dokondr如果您只是使用'lst = enc.transform(labels).toarray()'而不是for循環,那麼您應該對這兩種解決方案中的任何一種都沒有問題。 – ml4294

0

您可以使用np.argmax()

from sklearn.preprocessing import OneHotEncoder 
import numpy as np 

enc = OneHotEncoder() 
labels = [[1],[2],[3]] 
enc.fit(labels) 
x = enc.transform(labels).toarray() 


# x = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) 
xr = (np.argmax(x, axis=1)+1).reshape(-1, 1) 
print(xr) 

這應返回array([[1], [2], [3]])。如果您想改爲array([[0], [1], [2]]),只需刪除xr的定義中的+1即可。

+0

This(xr =(np.argmax(x,axis = 1)+1).reshape(-1,1))返回列表:[[1] [1] [1] [1] [1] .... – dokondr