web-dev-qa-db-fra.com

Comment convertir des encodages one-hot en entiers?

J'ai un ensemble de données de tableau numpy avec la forme (100,10). Chaque ligne correspond à un encodage à chaud. Je souhaite le transférer dans un nd-tableau de forme (100,), de sorte que j'ai transféré chaque ligne de vecteur dans un entier indiquant l'indice de l'index non nul. Y a-t-il un moyen rapide de le faire en utilisant numpy ou tensorflow?

17
jack

Comme Frank Demoncourt l'a souligné, puisqu'un one_hot n'a qu'un seul 1 et que le reste est constitué de zéros, vous pouvez utiliser argmax pour cet exemple particulier. En général, si vous voulez trouver une valeur dans un tableau numpy, vous voudrez probablement consulter numpy.where . En outre, cette question d'échange de pile:

Existe-t-il une fonction NumPy pour renvoyer le premier index de quelque chose dans un tableau?

Puisqu'un vecteur one-hot est un vecteur avec tous les 0 et un seul 1, vous pouvez faire quelque chose comme ceci:

>>> import numpy as np
>>> a = np.array([[0,1,0,0],[1,0,0,0],[0,0,0,1]])
>>> [np.where(r==1)[0][0] for r in a]
[1, 0, 3]

Cela construit simplement une liste de l'index qui est 1 pour chaque ligne. L'indexation [0] [0] consiste simplement à abandonner la structure (un Tuple avec un tableau) renvoyée par np.where, ce qui est supérieur à ce que vous avez demandé.

Pour une ligne particulière, vous voulez simplement indexer dans un fichier. Par exemple, dans la rangée zéro, le 1 se trouve dans l'index 1.

>>> np.where(a[0]==1)[0][0]
1
10
JawguyChooser

Vous pouvez utiliser numpy.argmax ou tf.argmax . Exemple:

import numpy as np  
a  = np.array([[0,1,0,0],[1,0,0,0],[0,0,0,1]])
print('np.argmax(a, axis=1): {0}'.format(np.argmax(a, axis=1)))

sortie:

np.argmax(a, axis=1): [1 0 3]

Vous voudrez peut-être aussi regarder sklearn.preprocessing.LabelBinarizer.inverse_transform .

22
Franck Dernoncourt

Bien que je suggère fortement d'utiliser numpy pour la vitesse, mpu.ml.one_hot2indices(one_hots) montre comment le faire sans numpy. Simplement pip install mpu --user --upgrade.

Alors tu peux faire

>>> one_hot2indices([[1, 0], [1, 0], [0, 1]])
[0, 0, 1]
0
Martin Thoma
def int_to_onehot(n, n_classes):
    v = [0] * n_classes
    v[n] = 1
    return v

def onehot_to_int(v):
    return v.index(1)


>>> v = int_to_onehot(2, 5)
>>> v
[0, 0, 1, 0, 0]


>>> i = onehot_to_int(v)
>>> i
2
0
Iván Sánchez

Vous pouvez utiliser ce code simple:

a=[[0,0,0,0,0,1,0,0,0,0]]
j=0
for i in a[0]:
    if i==1:
        print(j)
    else:
        j+=1

5

0
Emre Tatbak