Le moyen le plus efficace de trouver le mode dans un tableau numpy
J'ai un tableau 2D contenant des entiers (positifs ou négatifs). Chaque ligne représente les valeurs au cours du temps pour un particulier spatiale du site, tandis que chaque colonne représente les valeurs pour les différents spatiale des sites pour un temps donné.
Donc, si le tableau est comme:
1 3 4 2 2 7
5 2 2 1 4 1
3 3 2 2 1 1
Le résultat devrait être
1 3 2 2 2 1
Noter que lorsqu'il y a plusieurs valeurs pour la mode, un (choisi au hasard) peut être définie comme mode.
Je peux effectuer une itération sur les colonnes de trouver un mode à un moment mais j'espérais numpy pourrait avoir une certaine intégré la fonction pour le faire. Ou si il y a un truc à trouver efficacement sans boucle.
- Il y a docs.scipy.org/doc/scipy/reference/generated/... et la réponse ici: stackoverflow.com/questions/6252280/...
- Tu veux dire scipy.les stats.mode(), droit? L'autre semble sortie d'un masqués tableau.
- droit, merci pour la correction (et +1 pour ta réponse).
Vous devez vous connecter pour publier un commentaire.
Vérifier
scipy.les stats.mode()
(inspiré par @tom10 commentaire):De sortie:
Comme vous pouvez le voir, il renvoie à la fois à la mode ainsi que les chefs. Vous pouvez sélectionner les modes de directement via
m[0]
:De sortie:
import scipy.stats
explicitement, il n'est pas inclus lorsque vous n'avez tout simplement uneimport scipy
.axis=0
. Le code ci-dessus est de déclaration de la mode par la colonne de l'entrée. Le comte est de nous dire combien de fois il a vu que la signalées mode dans chacune des colonnes. Si vous vouliez l'ensemble de la mode, vous devez spécifieraxis=None
. Pour de plus amples informations, reportez-vous à docs.scipy.org/doc/scipy/reference/generated/...scipy.stats.mode
a été très lent pour certains cas, au point que la plus généralefind_repeats
peut être plus rapide: github.com/scipy/scipy/issues/3035Mise à jour
La
scipy.stats.mode
fonction a été considérablement optimisé depuis ce post, et serait la méthode recommandéeVieille réponse
C'est un problème délicat, car il n'y a pas beaucoup là-bas pour calculer le mode le long d'un axe. La solution est simple, pour les 1-D des tableaux, où
numpy.bincount
est à portée de main, avecnumpy.unique
avec lereturn_counts
arg commeTrue
. Le plus commun de n-dimensions de la fonction que je vois est de scipy.les stats.mode, même si c'est trop lente, en particulier pour les grands tableaux avec beaucoup de valeurs uniques. Comme solution, j'ai développé cette fonction, et de l'utiliser lourdement:Résultat:
Quelques repères:
EDIT: Fourni plus d'un arrière-plan et modifié l'approche plus efficace de la mémoire
Expansion sur cette méthode, appliqué à trouver le mode de données où vous pouvez avoir besoin de l'index du tableau réel de voir comment loin, la valeur est à partir du centre de la distribution.
N'oubliez pas de jeter la mode lors de la len(np.argmax(comtes)) > 1, pour valider si c'est effectivement représentatif de la centrale de distribution de vos données, vous pouvez vérifier si elle tombe à l'intérieur de votre écart-type intervalle.
Je pense que d'une manière très simple serait d'utiliser le Compteur de la classe. Vous pouvez ensuite utiliser la most_common() fonction de la Contre-exemple comme mentionné ici.
Pour des tableaux 1d:
Pour de multiples dimensions des tableaux (peu de différence):
Cela peut ou peut ne pas être une mise en œuvre efficace, mais il est pratique.
Une solution élégante qui seulement utilise
numpy
(passcipy
ni laCounter
classe):