Come funziona numpy.histogram ()?


Risposte:


167

Un bin è un intervallo che rappresenta la larghezza di una singola barra dell'istogramma lungo l'asse X. Potresti anche chiamarlo intervallo. (Wikipedia le definisce più formalmente come "categorie disgiunte".)

La histogramfunzione Numpy non disegna l'istogramma, ma calcola le occorrenze dei dati di input che rientrano in ogni bin, che a sua volta determina l'area (non necessariamente l'altezza se i bin non hanno la stessa larghezza) di ogni barra.

In questo esempio:

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

Sono disponibili 3 bin, per valori compresi tra 0 e 1 (escl. 1), 1 e 2 (escl. 2) e 2 e 3 (incl. 3), rispettivamente. Il modo in cui Numpy definisce questi contenitori se fornendo un elenco di delimitatori ( [0, 1, 2, 3]) in questo esempio, sebbene restituisca anche i contenitori nei risultati, poiché può sceglierli automaticamente dall'input, se non ne viene specificato nessuno. Se bins=5, ad esempio, verranno utilizzati 5 contenitori di uguale larghezza distribuiti tra il valore di input minimo e il valore di input massimo.

I valori di input sono 1, 2 e 1. Pertanto, bin "1 to 2" contiene due occorrenze (i due 1valori) e bin "2 to 3" contiene un'occorrenza (the 2). Questi risultati sono in primo elemento della tupla restituita: array([0, 2, 1]).

Poiché i contenitori qui hanno la stessa larghezza, è possibile utilizzare il numero di occorrenze per l'altezza di ciascuna barra. Una volta disegnato, avresti:

  • una barra di altezza 0 per range / bin [0,1] sull'asse X,
  • una barra di altezza 2 per range / bin [1,2],
  • una barra di altezza 1 per range / bin [2,3].

Puoi tracciarlo direttamente con Matplotlib (la sua histfunzione restituisce anche i contenitori ei valori):

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

inserisci qui la descrizione dell'immagine


8
Potresti anche essere interessato a questa risposta se vuoi tracciarli. Matplotlib può anche calcolarli direttamente . Vedi esempi qui e qui .
Bruno

Nel set di dati iris flowers, counts, bin_edges = np.histogram (iris_setosa ['petal_length'], bins = 10, density = True) mi dà i miei conteggi in valori fluttuanti, secondo l'esempio che hai fornito come può contare può essere un valore fluttuante?
Dipen Gajjar

La risposta migliore dovrebbe tenere in considerazione che un numero significativo di valori sopra il bordo destro più grande sarebbe ignorato. Aggiungere sempre i valori sopra il bordo delle grate all'ultimo contenitore o modificare l'ultimo binsvalore creato manualmente al valore massimo nell'array.
A. Ametov

@DipenGajjar Se ometti "density = True", non lo vedrai. La parola chiave di densità fornisce un istogramma "normalizzato" in cui è rappresentata la funzione di densità di probabilità. Puoi leggerlo qui .
BUFU

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

Di seguito, histindica che ci sono 0 articoli nel contenitore n. 0, 2 nel contenitore n. 1, 4 nel contenitore n. 3, 1 nel contenitore n. 4.

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

bin_edges indica che il bin # 0 è l'intervallo [0,1), il bin # 1 è [1,2), ..., il bin # 3 è [3,4).

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

Gioca con il codice sopra, cambia l'input in np.histograme guarda come funziona.


Ma un'immagine vale più di mille parole:

import matplotlib.pyplot as plt
plt.bar(bin_edges[:-1], hist, width = 1)
plt.xlim(min(bin_edges), max(bin_edges))
plt.show()   

inserisci qui la descrizione dell'immagine


4
Penso che questo sarebbe più preciso: plt.bar(bin_edges[:-1], hist, width=1)e plt.xlim(min(bin_edges), max(bin_edges)), per adattare le barre alla larghezza prevista (altrimenti, potrebbe esserci solo un contenitore più piccolo senza valori intermedi).
Bruno

È possibile utilizzare "hist" ottenuto nel formato numpy sopra nella funzione "plt.hist (...)"? Perché nel metodo bar, lo fornisci come una "y", mentre qui in hist, c'è solo x ..
kbg

7

Un'altra cosa utile da fare numpy.histogramè tracciare l'output come coordinate xey su un grafico a linee. Per esempio:

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

inserisci qui la descrizione dell'immagine

Questo può essere un modo utile per visualizzare gli istogrammi in cui si desidera un livello di granularità più elevato senza barre ovunque. Molto utile negli istogrammi delle immagini per identificare valori di pixel estremi.


Questo è molto utile per vedere le proiezioni di righe e colonne dell'immagine.
SKR
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.