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.
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:
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()
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()
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()
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.