2017-08-17 10 views
2

ワンホットエンコーディングを一意の整数で表されるカテゴリに変換する必要があります。次のコードで作成されたので、ワンホットエンコーディング:Scikit:ワンホットエンコーディングを整数でエンコーディングに変換

[1,2,3]または[11,37、45:

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

は、例えば、一意の整数の集合に変換することでし]または各整数が一意的に単一のクラスを表すその他のもの。

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) 

ない私はあなたが以下のようにnp.whereを使用していることを行うことができます

答えて

1

を必要とするもの:

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 - マトリックスであるため、np.where(a==1)[1]をちょうどnp.where(a)[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

を参照してください(実際には)二次元配列ではなく、一次元配列のリストを作成しました。 – ml4294

+0

@dokondr forループの代わりに単に 'lst = enc.transform(labels).toarray()'を使うと、どちらの解決法にも問題はありません。 – 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

これは(xr =(np.argmax(x、axis = 1)+1).reshape(-1,1))です。リストを返します。[[1] [1] [1] [1] [1] .... – dokondr

関連する問題