2012-02-04 7 views

risposta

121

Un intervallo è un intervallo che rappresenta la larghezza di una singola barra dell'istogramma lungo l'asse X. Si potrebbe anche chiamare questo l'intervallo. (Wikipedia li definisce più formalmente come "categorie disgiunte")

La funzione Numpy histogram non disegna l'istogramma, ma calcola le occorrenze dei dati di input che rientrano in ciascun contenitore, che a sua volta determina l'area (non necessariamente l'altezza se i raccoglitori non hanno larghezza uguale) di ciascuna barra.

In questo esempio:

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

Ci sono 3 scomparti, per valori compresi tra 0 e 1 (esclusa 1.), da 1 a 2 (escluse. 2) e 2 a 3 (. Incl 3) , rispettivamente. Il modo in cui Numpy definisce questi bin se in questo esempio fornisce un elenco di delimitatori ([0, 1, 2, 3]), sebbene restituisca anche i bin nei risultati, in quanto può essere scelto automaticamente dall'input, se non ne viene specificato nessuno. Ad esempio, se bins=5 utilizzerà 5 scomparti di larghezza uguale tra il valore di input minimo e il valore di input massimo.

I valori di ingresso sono 1, 2 e 1. Pertanto, bin "1 a 2" contiene due occorrenze (due 1 valori), e bin "2 a 3" contiene un'occorrenza (la 2). Questi risultati si trovano nel primo elemento della tupla restituita: array([0, 2, 1]).

Poiché i raccoglitori sono di larghezza uguale, è possibile utilizzare il numero di occorrenze per l'altezza di ciascuna barra. Quando viene disegnata, si avrebbe:

  • una barra di altezza 0 per la gamma/bin [0,1] sulla asse X,
  • una barra di altezza 2 per la gamma/bin [1,2] ,
  • una barra di altezza 1 per intervallo/scomparto [2,3].

È possibile tracciare questa direttamente con Matplotlib (la sua funzione hist restituisce anche i bidoni 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() 

enter image description here

+4

Potrebbe anche essere interessato a [questa risposta] (http://stackoverflow.com/a/5328669/372643) se si desidera tracciare loro. [Matplotlib può anche calcolarli direttamente] (http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.hist). Vedi esempi [qui] (http://matplotlib.sourceforge.net/examples/api/histogram_demo.html) e [qui] (http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html). – Bruno

+0

Grazie per questa risposta, mi ha appena salvato un sacco di problemi! – AlexFZ

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

Qui di seguito, hist indica che non vi sono 0 elementi nel bin # 0, 2 nel bin # 1, 4 nel bin # 3, 1 nel bin # 4.

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

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

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

giocare con il codice di cui sopra, cambiare l'ingresso da np.histogram e vedere come funziona.


Ma una foto 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() 

enter image description here

+3

Penso che sarebbe più preciso: 'plt.bar (bin_edges [: - 1], hist, width = 1)' e 'plt.xlim (min (bin_edges), max (bin_edges))', per rendere le barre misura la loro larghezza prevista (altrimenti, potrebbe esserci solo un raccoglitore più piccolo senza valori intermedi). – Bruno

+0

Bruno, grazie. Questo è certamente meglio. – unutbu

0

Un'altra cosa utile da fare con numpy.histogram è quello di tracciare l'output come il x e coordina y su un linegraph. 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() 

enter image description here

questo può essere un modo utile per visualizzare istogrammi in cui si desidera un maggiore livello di granularità senza sbarre ovunque. Molto utile negli istogrammi delle immagini per l'identificazione dei valori dei pixel estremi.