web-dev-qa-db-fra.com

Comment numpy.histogram () fonctionne-t-il?

Lors de la lecture sur numpy, j'ai rencontré la fonction numpy.histogram() .

A quoi ça sert et comment ça marche? Dans la documentation, ils mentionnent des bacs : Que sont-ils?

Quelques recherches sur Google m'ont conduit à la définition des histogrammes en général . Je comprends ça. Mais malheureusement, je ne peux pas lier cette connaissance aux exemples donnés dans la documentation.

107
Aufwind

Une zone est une plage représentant la largeur d'une barre unique de l'histogramme le long de l'axe des abscisses. Vous pouvez aussi appeler cela l'intervalle. (Wikipedia les définit plus formellement comme des "catégories disjointes".)

La fonction Numpy histogram ne dessine pas l'histogramme, mais calcule les occurrences des données d'entrée qui se trouvent dans chaque groupe, ce qui détermine à son tour la zone (pas nécessairement la hauteur si les groupes ne sont pas de même largeur). de chaque barre.

Dans cet exemple:

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

Il y a 3 emplacements, 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 groupes en donnant une liste de délimiteurs ([0, 1, 2, 3]) dans cet exemple, mais renvoie également les groupes dans les résultats, car il peut les choisir automatiquement à partir de l'entrée, si aucun n'est spécifié. Si bins=5, par exemple, il utilisera 5 intervalles d'égale largeur, répartis 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, les bin "1 à 2" contiennent deux occurrences (les deux valeurs 1), et les bin "2 à 3" contiennent une seule occurrence (le 2) . Ces résultats figurent dans le premier élément du tuple renvoyé: array([0, 2, 1]).

Les bacs ici ayant une largeur égale, vous pouvez utiliser le nombre d'occurrences pour la hauteur de chaque barre. Une fois tiré, vous aurez:

  • une barre de hauteur 0 pour la plage/bin [0,1] sur l'axe X,
  • une barre de hauteur 2 pour range/bin [1,2],
  • une barre de hauteur 1 pour range/bin [2,3].

Vous pouvez tracer cela directement avec Matplotlib (sa fonction hist renvoie également les bacs 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

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

Ci-dessous, hist indique qu'il y a 0 éléments 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 la case n ° 0 est l'intervalle [0,1), la case n ° 1 est [1,2), ..., la case n ° 3 est [3,4).

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

Jouez avec le code ci-dessus, modifiez l'entrée en np.histogram et voyez 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

60
unutbu

Une autre chose utile à faire avec numpy.histogram consiste à tracer la sortie sous forme de coordonnées x et y sur un graphique à courbes. 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 où vous voudriez un niveau de granularité supérieur sans barres partout. Très utile dans les histogrammes d’image pour identifier les valeurs de pixels extrêmes.

4
Grr