148 votes

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 dans le temps pour un site spatial particulier, tandis que chaque colonne représente les valeurs pour divers sites spatiaux 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

Notez que lorsqu'il y a plusieurs valeurs pour le mode, n'importe laquelle (choisie au hasard) peut être définie comme mode.

Je peux itérer sur les colonnes en trouvant le mode un par un mais j'espérais que numpy aurait une fonction intégrée pour le faire. Ou s'il y a une astuce pour trouver cela efficacement sans faire de boucle.

11voto

Ashutosh K Singh Points 131

La manière la plus simple en Python pour obtenir le mode d'une liste ou d'un tableau a

   import statistics
   print("mode = "+str(statistics.(mode(a)))

C'est ça.

3voto

Ali_Ayub Points 31

Je pense qu'un moyen très simple serait d'utiliser la classe Counter. Vous pouvez ensuite utiliser la fonction most_common() de l'instance de Counter comme indiqué ci-dessous. aquí .

Pour les réseaux 1-d :

import numpy as np
from collections import Counter

nparr = np.arange(10) 
nparr[2] = 6 
nparr[3] = 6 #6 is now the mode
mode = Counter(nparr).most_common(1)
# mode will be [(6,3)] to give the count of the most occurring value, so ->
print(mode[0][0])    

Pour les tableaux à plusieurs dimensions (petite différence) :

import numpy as np
from collections import Counter

nparr = np.arange(10) 
nparr[2] = 6 
nparr[3] = 6 
nparr = nparr.reshape((10,2,5))     #same thing but we add this to reshape into ndarray
mode = Counter(nparr.flatten()).most_common(1)  # just use .flatten() method

# mode will be [(6,3)] to give the count of the most occurring value, so ->
print(mode[0][0])

Cette mise en œuvre n'est pas forcément efficace, mais elle est pratique.

2voto

Zeliha Bektas Points 21
from collections import Counter

n = int(input())
data = sorted([int(i) for i in input().split()])

sorted(sorted(Counter(data).items()), key = lambda x: x[1], reverse = True)[0][0]

print(Mean)

Le site Counter(data) compte la fréquence et renvoie undict par défaut. sorted(Counter(data).items()) trie en utilisant les touches, pas la fréquence. Enfin, il faut trier la fréquence en utilisant un autre tri avec key = lambda x: x[1] . L'inverse indique à Python de trier la fréquence de la plus grande à la plus petite.

1voto

Mayank Points 21

si vous voulez trouver le mode en tant que valeur int, voici la méthode la plus simple J'ai essayé de trouver le mode d'un tableau en utilisant Scipy Stats mais le problème est que la sortie du code ressemble à ceci :

ModeResult(mode=array(2), count=array([[1, 2, 2, 2, 1, 2]])) Je ne veux que la sortie Integer, donc si vous voulez la même chose, essayez ceci

import numpy as np
from scipy import stats
numbers = list(map(int, input().split())) 
print(int(stats.mode(numbers)[0]))

La dernière ligne est suffisante pour imprimer la valeur du mode en Python : print(int(stats.mode(numbers)[0]))

1voto

Si vous souhaitez utiliser uniquement numpy et le faire sans utiliser l'index du tableau. L'implémentation suivante combinant les dictionnaires avec numpy peut être utilisée.

val,count = np.unique(x,return_counts=True)

freq = {}
for v,c in zip(val,count):
  freq[v] = c
mode = sorted(freq.items(),key =lambda kv :kv[1])[-1]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X