Comment fonctionne numpy.histogramme () travail?
En lisant sur numpy, j'ai rencontré la fonction numpy.histogram()
.
À quoi sert-il et Comment ça marche? Dans les docs ils mentionnent bacs: Quels sont-ils?
Quelques recherches sur Google m'ont conduit à la définition des histogrammes en général . Je le conçois. Mais malheureusement, je ne peux pas lier cette connaissance aux exemples donnés dans les docs.
3 réponses
Un bac est une gamme qui représente la largeur d'une seule barre de l'histogramme, le long de l'axe des abscisses. Vous pouvez également 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 elle calcule les occurrences des données d'entrée qui se trouvent dans chaque bac, ce qui détermine à son tour la surface (pas nécessairement la hauteur si les bacs ne sont pas de largeur égale) de chaque barre.
Dans ce 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 bins si en donnant une liste de délimiteurs ([0, 1, 2, 3]
) dans cet exemple, bien qu'il renvoie également les bins 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 bins de largeur égale répartis entre la valeur d'entrée minimale et l'entrée maximale valeur.
Les valeurs d'entrée sont 1, 2 et 1. Par conséquent, bin "1 à 2" contient deux occurrences (les deux valeurs 1
), et bin "2 à 3" contient une occurrence (le 2
). Ces résultats sont 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 range / bin [0,1] sur l'axe des abscisses,
- une barre de hauteur 2 pour plage / bac [1,2],
- une barre de hauteur 1 de gamme/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()
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 #0, 2 dans le bac #1, 4 dans le bac #3, 1 dans le bac #4.
print(hist)
# array([0, 2, 4, 1])
bin_edges
indique que bin #0 est l'intervalle [0,1), bin #1 est [1,2), ...,
bin #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 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
est de tracer la sortie en tant que coordonnées x et y sur un graphique de ligne. 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 souhaitez un niveau de granularité plus élevé sans barres partout. Très utile dans les histogrammes d'image pour identifier les valeurs de pixels extrêmes.