Disons que j'ai un tableau numpy 1d
a = array([1,0,3])
Je voudrais encoder ceci en tant que tableau 2d 1-hot
b = array([[0,1,0,0], [1,0,0,0], [0,0,0,1]])
Existe-t-il un moyen rapide de procéder? Plus rapide que de simplement boucler a
pour définir des éléments de b
, c'est-à-dire.
python
numpy
machine-learning
numpy-ndarray
one-hot-encoding
James Atwood
la source
la source
b = np.zeros((a.size, a.max()+1))
:, puis `b [np.arange (a.size), a] = 1`la source
values
devrait être un tableau Numpy plutôt qu'une liste Python, alors cela fonctionne dans toutes les dimensions, pas seulement dans 1D.np.max(values) + 1
tant que nombre de compartiments peut ne pas être souhaitable si votre ensemble de données est, par exemple, échantillonné au hasard et que, par hasard, il peut ne pas contenir de valeur maximale. Le nombre de compartiments doit être plutôt un paramètre et une assertion / vérification peut être en place pour vérifier que chaque valeur est comprise entre 0 (incl) et le nombre de compartiments (excl).numpy
documents): à chaque emplacement de la matrice d'origine (values
), nous avons un entierk
, et nous "plaçons" le vecteur 1-chaudeye(n)[k]
à cet emplacement . Cela ajoute une dimension car nous «plaçons» un vecteur à l'emplacement d'un scalaire dans la matrice d'origine.Dans le cas où vous utilisez des keras, il existe un utilitaire intégré pour cela:
Et cela fait à peu près la même chose que la réponse de @ YXD (voir code source ).
la source
Voici ce que je trouve utile:
Ici
num_classes
représente le nombre de classes que vous avez. Donc, si vous avez una
vecteur de forme (10000,) cette fonction le transforme en (10000, C) . Notez qu'ila
est indexé zéro, c'est-à-direone_hot(np.array([0, 1]), 2)
qu'il donnera[[1, 0], [0, 1]]
.Exactement ce que vous vouliez avoir, je crois.
PS: la source est les modèles de séquence - deeplearning.ai
la source
np.eye(num_classes)[a.reshape(-1)]. What you are simply doing is using
np.eye` vous créez une matrice diagonale avec chaque index de classe comme 1 reste zéro et plus tard en utilisant les index fournis ena.reshape(-1)
produisant la sortie correspondant à l'indice ennp.eye()
. Je ne comprenais pas la nécessiténp.sqeeze
car nous l'utilisons pour simplement supprimer des dimensions uniques que nous n'aurons jamais car la dimension de sortie sera toujours(a_flattened_size, num_classes)
Vous pouvez utiliser
sklearn.preprocessing.LabelBinarizer
:Exemple:
production:
Entre autres choses, vous pouvez initialiser de
sklearn.preprocessing.LabelBinarizer()
sorte que la sortie detransform
soit rare.la source
Vous pouvez également utiliser la fonction oculaire de numpy:
numpy.eye(number of classes)[vector containing the labels]
la source
np.identity(num_classes)[indices]
pourrait être meilleure. Bonne réponse!Voici une fonction qui convertit un vecteur 1D en un tableau unidimensionnel 2D.
Voici un exemple d'utilisation:
la source
assert
de vérification de la forme des vecteurs;)).assert ___
enif not ___ raise Exception(<Reason>)
.Pour 1-encodage à chaud
Par exemple
PROFITEZ DU CODAGE
la source
>>> import numpy as np >>> import pandas >>> a = np.array([1,0,3]) >>> one_hot_encode=pandas.get_dummies(a) >>> print(one_hot_encode) 0 1 3 0 0 1 0 1 1 0 0 2 0 0 1 >>> print(one_hot_encode[1]) 0 1 1 0 2 0 Name: 1, dtype: uint8 >>> print(one_hot_encode[0]) 0 0 1 1 2 0 Name: 0, dtype: uint8 >>> print(one_hot_encode[3]) 0 0 1 0 2 1 Name: 3, dtype: uint8
Je pense que la réponse courte est non. Pour un cas plus générique dans les
n
dimensions, j'ai trouvé ceci:Je me demande s'il y a une meilleure solution - je n'aime pas que je doive créer ces listes dans les deux dernières lignes. Quoi qu'il en soit, j'ai fait quelques mesures avec
timeit
et il semble que les versionsnumpy
basées sur (indices
/arange
) et les versions itératives fonctionnent à peu près de la même manière.la source
Juste pour développer l' excellente réponse de K3 --- rnc , voici une version plus générique:
En outre, voici un benchmark rapide et sale de cette méthode et une méthode de la réponse actuellement acceptée par YXD (légèrement modifiée, afin qu'ils offrent la même API, sauf que cette dernière ne fonctionne qu'avec des ndarrays 1D):
Cette dernière méthode est ~ 35% plus rapide (MacBook Pro 13 2015), mais la première est plus générale:
la source
Vous pouvez utiliser le code suivant pour la conversion en un vecteur unique:
soit x est le vecteur de classe normal ayant une seule colonne avec des classes 0 à un certain nombre:
si 0 n'est pas une classe; puis supprimez +1.
la source
J'ai récemment rencontré un problème du même genre et j'ai trouvé cette solution qui s'est avérée satisfaisante uniquement si vous avez des nombres qui entrent dans une certaine formation. Par exemple, si vous souhaitez coder à chaud la liste suivante:
allez-y, les solutions affichées sont déjà mentionnées ci-dessus. Mais que faire si l'on considère ces données:
Si vous le faites avec les méthodes mentionnées ci-dessus, vous vous retrouverez probablement avec 90 colonnes à chaud. C'est parce que toutes les réponses incluent quelque chose comme
n = np.max(a)+1
. J'ai trouvé une solution plus générique qui a fonctionné pour moi et j'ai voulu partager avec vous:J'espère que quelqu'un a rencontré les mêmes restrictions sur les solutions ci-dessus et cela pourrait être utile
la source
Ce type d'encodage fait généralement partie du tableau numpy. Si vous utilisez un tableau numpy comme celui-ci:
alors il y a un moyen très simple de convertir cela en un encodage à chaud
C'est tout.
la source
solution propre et facile:
la source
Utilisation d'une étape de pipeline Neuraxle :
Lien vers la documentation: neuraxle.steps.numpy.OneHotEncoder
la source
Voici un exemple de fonction que j'ai écrit pour ce faire en fonction des réponses ci-dessus et de mon propre cas d'utilisation:
la source
J'ajoute pour terminer une fonction simple, en utilisant uniquement des opérateurs numpy:
Il prend en entrée une matrice de probabilité: ex:
Et ça reviendra
la source
Voici une solution autonome indépendante de la dimension.
Cela convertira tout tableau N-dimensionnel
arr
d'entiers non négatifs en un tableau N + 1 unidimensionnelone_hot
, oùone_hot[i_1,...,i_N,c] = 1
signifiearr[i_1,...,i_N] = c
. Vous pouvez récupérer l'entrée vianp.argmax(one_hot, -1)
la source
Utilisez le code suivant. Cela fonctionne mieux.
Trouvé ici PS Vous n'avez pas besoin d'entrer dans le lien.
la source