Comment fonctionne numpy.histogram ()?

120

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

À quoi ça sert et comment ça marche? Dans la documentation, ils mentionnent les 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 relier ces connaissances aux exemples donnés dans la documentation.

Aufwind
la source

Réponses:

167

Un bac est une plage qui représente la largeur d'une seule barre de l'histogramme le long de l'axe X. Vous pouvez également appeler cela l'intervalle. (Wikipedia les définit plus formellement comme des «catégories disjointes».)

La histogramfonction Numpy ne dessine pas l'histogramme, mais elle calcule les occurrences de données d'entrée qui entrent dans chaque bac, qui à son tour détermine la zone (pas nécessairement la hauteur si les bacs 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 casiers, pour des valeurs allant de 0 à 1 (sauf 1.), 1 à 2 (excl. 2) et 2 à 3 (incl. 3), respectivement. La façon dont Numpy définit ces bins est 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 bacs de largeur égale 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, le bac "1 à 2" contient deux occurrences (les deux 1valeurs) et le bac "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 cases ici 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 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 histfonction retourne é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()

entrez la description de l'image ici

Bruno
la source
8
Cette réponse pourrait également vous intéresser si vous souhaitez les tracer. Matplotlib peut également les calculer directement . Voir des exemples ici et ici .
Bruno le
Dans l'ensemble de données des fleurs d'iris, compte, bin_edges = np.histogram (iris_setosa ['petal_length'], bins = 10, densité = True) me donne mes comptes en valeurs flottantes, selon l'exemple que vous avez donné valeur flottante?
Dipen Gajjar
La meilleure réponse doit tenir compte du fait qu'un nombre significatif de valeurs au-dessus du plus grand bord droit serait ignoré. Ajoutez toujours des valeurs au-dessus du bord des grilles au dernier bac ou remplacez la dernière binsvaleur créée manuellement par la valeur maximale du tableau.
A.Ametov
@DipenGajjar Si vous omettez "densité = True", vous ne verrez pas cela. Le mot-clé densité vous donne un histogramme «normalisé» dans lequel la fonction de densité de probabilité est représentée. Vous pouvez en savoir plus ici .
BUFU
67
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

Ci-dessous, histindique qu'il y a 0 articles 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, changez l'entrée np.histogramet 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()   

entrez la description de l'image ici

unutbu
la source
4
Je pense que ce serait plus précis: plt.bar(bin_edges[:-1], hist, width=1)et plt.xlim(min(bin_edges), max(bin_edges)), pour que les barres correspondent à leur largeur attendue (sinon, il se peut qu'il y ait juste un bac plus petit sans valeurs entre les deux).
Bruno le
Est-il possible d'utiliser le "hist" obtenu dans le format numpy ci-dessus dans la fonction "plt.hist (...)"? Parce que dans la méthode de la barre, vous le fournissez comme un "y", alors qu'ici dans hist, il n'y a que x ..
kbg
7

Une autre chose utile à faire numpy.histogramest 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()

entrez la description de l'image ici

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.

Grr
la source
Ceci est très utile pour voir les projections de lignes et de colonnes d'images.
SKR