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.

97
demandé sur Salvador Dali 2012-02-04 18:56:40

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

entrez la description de l'image ici

132
répondu Bruno 2012-02-04 15:31:10
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()   

entrez la description de l'image ici

57
répondu unutbu 2012-02-04 17:07:07

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

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.

3
répondu Grr 2017-12-28 21:33:14