2017-10-12 7 views
0

J'ai un tableau numérique (N, M) où certaines des colonnes doivent être codées à chaud unique. S'il vous plaît, aidez à faire un encodage à chaud en utilisant numpy et/ou tensorflow.codage à chaud unique et données existantes

Exemple:

[ 
[ 0.993, 0, 0.88 ] 
[ 0.234, 1, 1.00 ] 
[ 0.235, 2, 1.01 ] 
..... 
] 

La 2ème colonne ici (avec les valeurs 3 et 2) doit être un codé à chaud, je sais qu'il n'y a que trois valeurs distinctes (0, 1, 2).

Le tableau résultant devrait ressembler à:

[ 
[ 0.993, 0.88, 0, 0, 0 ] 
[ 0.234, 1.00, 0, 1, 0 ] 
[ 0.235, 1.01, 1, 0, 0 ] 
..... 
] 

Comme que je serais en mesure d'alimenter ce tableau dans le tensorflow. Veuillez noter que la deuxième colonne a été supprimée et que sa version à chaud a été ajoutée à la fin de chaque sous-tableau.

Toute aide serait grandement appréciée. Merci d'avance.

Mise à jour:

Voici ce que j'ai en ce moment: Eh bien, pas exactement ... 1. J'ai plus de 3 colonnes dans le tableau ... mais je veux encore faire seulement 2 .. 2. premier tableau est structuré, à savoir sa forme est (N,)

Voici ce que j'ai:

def one_hot(value, max_value): 
    value = int(value) 
    a = np.zeros(max_value, 'uint8') 
    if value != 0: 
     a[value] = 1 
    return a 

# data is structured array with the shape of (N,) 
# it has strings, ints, floats inside.. 
# was get by np.genfromtxt(dtype=None) 

unique_values = dict() 
unique_values['categorical1'] = 1 
unique_values['categorical2'] = 2 
for row in data: 
    row[col] = unique_values[row[col]] 

codes = np.zeros((data.shape[0], len(unique_values))) 

idx = 0 
for row in data: 
    codes[idx] = one_hot(row[col], len(unique_values)) # could be optimised by not creating new array every time 
    idx += 1 

data = np.c_[data[:, [range(0, col), range(col + 1, 32)]], codes[data[:, col].astype(int)]] 

essayer de concaténer également via:

print data.shape # shape (5000,) 
print codes.shape # shape (5000,3) 
data = np.concatenate((data, codes), axis=1) 
+0

deuxième col avait des valeurs 0,1,2. Je ne vois pas comment cela a créé le tableau ajouté codé à chaud unique. Typo peut-être? – Divakar

+0

0 est codé 0, 0, 0. 1 est codé 0, 1, 0. 2 est codé 1, 0, 0 – user3489820

+0

Je n'ai pas besoin d'avoir une représentation binaire exacte des valeurs. Je veux dire si 2 sera codé comme 0, 0, 1 et 1 sera codé comme 1, 0, 0 c'est aussi bien pour moi, mais je pense que 0 devrait être codé comme 0, 0, 0. – user3489820

Répondre

0

est ici une approche -

In [384]: a # input array 
Out[384]: 
array([[ 0.993, 0. , 0.88 ], 
     [ 0.234, 1. , 1. ], 
     [ 0.235, 2. , 1.01 ]]) 

In [385]: codes = np.array([[0,0,0],[0,1,0],[1,0,0]]) # define codes here 

In [387]: codes 
Out[387]: 
array([[0, 0, 0], # encoding for 0 
     [0, 1, 0], # encoding for 1 
     [1, 0, 0]]) # encoding for 2 

# Slice out the second column and append one-hot encoded array 
In [386]: np.c_[a[:,[0,2]], codes[a[:,1].astype(int)]] 
Out[386]: 
array([[ 0.993, 0.88 , 0. , 0. , 0. ], 
     [ 0.234, 1. , 0. , 1. , 0. ], 
     [ 0.235, 1.01 , 1. , 0. , 0. ]]) 
+0

Disons que je suis un tableau: [ [0,993, 0, 0,88] [0,234, 1, 1,00] [0,235, 2, 1,01] [0,234, 0, 2,01] .....] Pouvez-vous inclure une matrice de codes de génération dynamique basée sur la matrice source? – user3489820

+0

@ user3489820 Doit fonctionner indépendamment. Utilisez cela comme le nouveau «a» et fonctionnerait sans rien changer d'autre. – Divakar

+0

@ user3489820 Alors, ça a marché pour vous? – Divakar