La façon la plus rapide pour calculer l'entropie de chaque tableau numpy ligne?
J'ai un tableau de taille MxN et je voudrais calculer la valeur d'entropie de chaque ligne. Quel serait le moyen le plus rapide de le faire ?
l'entropie: -np.somme(probs * np.log2(probs))
Par le plus rapide, vous voulez dire que vous voulez une version optimisée, ou voulez-vous dire que vous voulez quelque chose qui s'inscrit dans une ligne et il est facile à lire?
pas la plus facile, la plus rapide en termes de calcul puisque j'ai une assez grande matrice, ligne itération prend trop de temps.
Votre premier commentaire devrait être une partie de la question. J'interprète la question comme "j'ai un tableau de probabilités
Par le plus rapide, vous voulez dire que vous voulez une version optimisée, ou voulez-vous dire que vous voulez quelque chose qui s'inscrit dans une ligne et il est facile à lire?
pas la plus facile, la plus rapide en termes de calcul puisque j'ai une assez grande matrice, ligne itération prend trop de temps.
Votre premier commentaire devrait être une partie de la question. J'interprète la question comme "j'ai un tableau de probabilités
probs
, et je veux l'entropie de l'lignes." Si vous n'avez pas de probabilités, veuillez préciser la question.OriginalL'auteur erogol | 2015-11-09
Vous devez vous connecter pour publier un commentaire.
scipy.spécial.entr
calcule -x*log(x) pour chaque élément dans un tableau. Après l'appel, vous pouvez additionner les lignes.Voici un exemple. Tout d'abord, créez un tableau
p
de valeurs positives dont les lignes somme de 1:Maintenant calculer l'entropie de chaque ligne.
entr
utilise le logarithme naturel, de sorte à obtenir le base-2 log, divisez le résultat parlog(2)
.Si vous ne voulez pas que la dépendance sur
scipy
, vous pouvez utiliser la formule explicite:scipy.stats.entropy
calcule également la même valeur queentr(p).sum(axis=1)
OriginalL'auteur Warren Weckesser
@Warren l'a souligné, il est difficile de savoir à partir de votre question de savoir si vous êtes au départ d'un tableau de probabilités, ou de la crue des échantillons eux-mêmes. Dans ma réponse j'ai assumé ce dernier, auquel cas le principal goulot d'étranglement sera le calcul de la bin compte sur chaque ligne.
En supposant que chaque vecteur d'échantillons est relativement long, le moyen le plus rapide pour ce faire sera probablement utiliser
np.bincount
:Bien que Warren méthode de calcul des entropies de la probabilité des valeurs à l'aide
entr
est légèrement plus rapide qu'à l'aide de la formule explicite, dans la pratique, il est probable que cela ne représentent qu'une infime fraction de la quantité totale d'exécution par rapport au temps nécessaire pour calculer le bin compte.Test de justesse à une seule rangée:
Vitesse d'essai:
Si vos données ne consiste pas en entier indices entre 0 et le nombre de valeurs uniques, vous pouvez les convertir dans ce format à l'aide
np.unique
:-np.dot(a, b)
en place de-np.sum(a * b)
Avec
np.dot
je ne peut pas facilement vectoriser l'entropie de calcul sur plusieurs lignes. Un autre moyen serait quelque chose comme-np.einsum('ij,ij->i', p, np.log2(p))
, bien que vous pourriez tout aussi bien utiliserentr
pour cette partie car il a uneaxis
argument. De toute façon, le coûteux partie est généralement le calcul de la corbeille du compte.OriginalL'auteur ali_m