110 votes

Comment fonctionne numpy.histogram() ?

En me documentant sur numpy, j'ai rencontré la fonction numpy.histogram() .

A quoi cela sert-il et comment cela fonctionne-t-il ? Dans les documents, ils mentionnent bacs : Qu'est-ce que c'est ?

Quelques recherches sur Google m'ont conduit au définition des histogrammes en général . Je comprends. Mais malheureusement je ne peux pas relier cette connaissance aux exemples donnés dans les docs.

157voto

Bruno Points 47560

Un bin est une plage qui représente la largeur d'une seule barre de l'histogramme le long de l'axe des X. On pourrait aussi appeler cela l'intervalle. (Wikipedia les définit plus formellement comme des "catégories disjointes").

Le Numpy histogram ne dessine pas l'histogramme, mais elle calcule les occurrences des données d'entrée qui se trouvent dans chaque case, ce qui détermine la surface (pas nécessairement la hauteur si les cases ne sont pas de largeur égale) de chaque barre.

Dans cet exemple :

 np.histogram([1, 2, 1], bins=[0, 1, 2, 3])

Il y a 3 bacs, pour des valeurs allant de 0 à 1 (excl. 1.), 1 à 2 (excl. 2) et 2 à 3 (incl. 3), respectivement. La façon dont Numpy définit ces intervalles est en donnant une liste de délimiteurs ( [0, 1, 2, 3] ) dans cet exemple, bien qu'il renvoie également les bacs dans les résultats, puisqu'il peut les choisir automatiquement à partir de l'entrée, si aucun n'est spécifié. Si bins=5 Par exemple, il utilisera 5 cases de largeur égale réparties entre la valeur d'entrée minimale et la valeur d'entrée maximale.

Les valeurs d'entrée sont 1, 2 et 1. Par conséquent, l'emplacement "1 à 2" contient deux occurrences (les deux valeurs "1 à 2"). 1 ), et l'emplacement "2 à 3" contient une occurrence (la valeur 2 ). Ces résultats se trouvent dans le premier élément du tuple retourné : array([0, 2, 1]) .

Puisque les bacs sont de largeur égale, vous pouvez utiliser le nombre d'occurrences pour la hauteur de chaque barre. Une fois dessiné, vous auriez :

  • une barre de hauteur 0 pour l'intervalle/bin [0,1] sur l'axe des X,
  • une barre de hauteur 2 pour l'intervalle/le bac [1,2],
  • une barre de hauteur 1 pour la gamme/le bac [2,3].

Vous pouvez le tracer directement avec Matplotlib (son hist renvoie également les bins et les valeurs) :

>>> import matplotlib.pyplot as plt
>>> plt.hist([1, 2, 1], bins=[0, 1, 2, 3])
(array([0, 2, 1]), array([0, 1, 2, 3]), <a list of 3 Patch objects>)
>>> plt.show()

enter image description here

64voto

unutbu Points 222216
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

En dessous, hist indique qu'il y a 0 article dans le bac n°0, 2 dans le bac n°1, 4 dans le bac n°3, 1 dans le bac n°4.

print(hist)
# array([0, 2, 4, 1])   

bin_edges indique que le bac #0 est l'intervalle [0,1), le bac #1 est [1,2), ..., le casier n°3 est [3,4).

print (bin_edges)
# array([0, 1, 2, 3, 4]))  

Jouez avec le code ci-dessus, changez l'entrée en np.histogram et voir comment cela fonctionne.


Mais une image vaut mille mots :

import matplotlib.pyplot as plt
plt.bar(bin_edges[:-1], hist, width = 1)
plt.xlim(min(bin_edges), max(bin_edges))
plt.show()   

enter image description here

7voto

Grr Points 6929

Une autre chose utile à faire avec numpy.histogram est de tracer la sortie sous forme de coordonnées x et y sur un graphique linéaire. Par exemple :

arr = np.random.randint(1, 51, 500)
y, x = np.histogram(arr, bins=np.arange(51))
fig, ax = plt.subplots()
ax.plot(x[:-1], y)
fig.show()

enter image description here

Cela peut être un moyen utile de visualiser des histogrammes lorsque vous souhaitez un niveau de granularité plus élevé sans barres partout. Très utile dans les histogrammes d'images pour identifier les valeurs extrêmes des pixels.

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