2012-02-04 7 views

Odpowiedz

121

Zasobnik to zakres reprezentujący szerokość pojedynczego słupka histogramu wzdłuż osi X. Można również nazwać to odstępem czasu. (Wikipedia definiuje je bardziej formalnie jako "rozłączne kategorie").

Funkcja Numpy histogram nie rysuje histogramu, ale oblicza wystąpienie danych wejściowych, które mieszczą się w każdym pojemniku, co z kolei określa obszar (nie koniecznie wysokość, jeśli pojemniki nie mają jednakowej szerokości) każdego pręta.

w poniższym przykładzie:

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

są 3 pojemniki dla wartości w zakresie od 0 do 1 (z wyłączeniem 1), 1 do 2 (zaw. 2) i od 2 do 3 (. Łącznie z 3) , odpowiednio. Sposób, w jaki Numpy definiuje te pojemniki, podając w tym przykładzie listę ograniczników ([0, 1, 2, 3]), mimo że zwraca również pojemniki w wynikach, ponieważ może wybrać je automatycznie z danych wejściowych, jeśli żadna nie zostanie określona. Jeśli na przykład bins=5, użyje 5 pojemników o jednakowej szerokości między minimalną wartością wejściową a maksymalną wartością wejściową.

Wartości wejściowe to 1, 2 i 1. Dlatego bin "1 do 2" zawiera dwa wystąpienia (dwie wartości 1), a bin "2 do 3" zawiera jedno wystąpienie (2). Te wyniki znajdują się w pierwszej pozycji w zwróconej krotce: array([0, 2, 1]).

Ponieważ pojemniki są tutaj równej szerokości, można użyć liczby wystąpień dla wysokości każdego słupka. Wydobyte, trzeba:

  • bar wysokości 0 dla zakresu/bin [0,1] na osi X,
  • bar wysokości 2 dla zakresu/bin [1,2] ,
  • pręt o wysokości 1 dla zakresu/zasobnika [2,3].

można wykreślić to bezpośrednio z matplotlib (jego hist zwraca również kosze i wartości):

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

Możesz również być zainteresowany [tą odpowiedzią] (http://stackoverflow.com/a/5328669/372643), jeśli chcesz je narysować. [Matplotlib może również obliczyć je bezpośrednio] (http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.hist). Zobacz przykłady [tutaj] (http://matplotlib.sourceforge.net/examples/api/histogram_demo.html) i [tutaj] (http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html). – Bruno

+0

Dziękuję za tę odpowiedź, uratowało mi to mnóstwo problemów! – AlexFZ

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

Poniżej hist wskazuje, że istnieje to 0 pozycji w bin # 0, 2 w bin # 1, 4 w bin # 3, 1 in bin # 4.

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

bin_edges oznacza, że ​​pojemnik # 0 jest z przedziału [0,1), pojemnik 1 jest [1,2), ..., pojemnik 3 jest [3,4).

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

Odtwórz powyższym kodem, zmień dane wejściowe na np.histogram i zobacz, jak to działa.


Ale obraz jest wart tysiąca słów:

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

Myślę, że byłoby bardziej dokładne: 'plt.bar (bin_edges [: - 1], hist, width = 1)' i 'plt.xlim (min (bin_edges), max (bin_edges))', aby paski dopasuj ich oczekiwaną szerokość (w przeciwnym razie może być tylko mniejszy pojemnik bez żadnych wartości). – Bruno

+0

Bruno, dzięki. To na pewno jest lepsze. – unutbu

0

Inną użyteczną rzeczą do zrobienia z numpy.histogram jest wykreślić wyjście jako współrzędne X i Y na graf krawędziowy. Na przykład:

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

To może być użytecznym sposobem wizualizacji histogramy gdzie chcesz wyższy poziom szczegółowości bez barów wszędzie. Bardzo przydatne w histogramach obrazu do identyfikacji ekstremalnych wartości pikseli.