2017-04-20 28 views
1

二進制值我有一個numpy的陣列,其看起來如下:一個熱編碼在numpy的

array([[0],[1],[1]]) 

我希望它被表示爲一個熱編碼當量:

array([[1,0],[0,1],[0,1]]) 

任何機構有任何想法?我嘗試使用sklearn.preprocessing.LabelBinarizer,但這只是重新生成輸入。

謝謝。

編輯

按照要求,這裏是使用LabelBinarizer

代碼
from sklearn.preprocessing import LabelBinarizer 

train_y = np.array([[0],[1],[1]]) 
lb = LabelBinarizer() 
lb.fit(train_y) 
label_vecs = lb.transform(train_y) 

輸出:

array([[0],[1],[1]]) 

請注意,它在documentation「二進制目標狀態轉變爲列向量'

+0

你如何使用LabelBinarizer。它應該是正確的。發佈你的代碼和當前輸出(你說它只是重新生成輸入) –

+0

按要求更新 – user1753640

+0

好的。對於指定的輸出('array([[1,0],[0,1],[0,1]])'),您可以使用MultiLabelBinarizer。請在我的其他答案中查看它的用法 - http://stackoverflow.com/a/42392689/3374996。但是 –

回答

3

要使用sklearn,似乎我們可以使用OneHotEncoder,像這樣 -

from sklearn.preprocessing import OneHotEncoder 

train_y = np.array([[0],[1],[1]]) # Input 

enc = OneHotEncoder() 
enc.fit(train_y) 
out = enc.transform(train_y).toarray() 

樣品輸入,輸出 -

In [314]: train_y 
Out[314]: 
array([[0], 
     [1], 
     [1]]) 

In [315]: out 
Out[315]: 
array([[ 1., 0.], 
     [ 0., 1.], 
     [ 0., 1.]]) 

In [320]: train_y 
Out[320]: 
array([[9], 
     [4], 
     [1], 
     [6], 
     [2]]) 

In [321]: out 
Out[321]: 
array([[ 0., 0., 0., 0., 1.], 
     [ 0., 0., 1., 0., 0.], 
     [ 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 1., 0., 0., 0.]]) 

initialization另一種方法 -

def initialization_based(A): # A is Input array 
    a = np.unique(A, return_inverse=1)[1] 
    out = np.zeros((a.shape[0],a.max()+1),dtype=int) 
    out[np.arange(out.shape[0]), a.ravel()] = 1 
    return out 

另有broadcasting -

def broadcasting_based(A): # A is Input array 
    a = np.unique(A, return_inverse=1)[1] 
    return (a.ravel()[:,None] == np.arange(a.max()+1)).astype(int)