Jak działa numpy.histogram ()?

120

Czytając numpy, napotkałem funkcję numpy.histogram().

Do czego służy i jak działa? W dokumentach wspominają o pojemnikach : Co to jest?

Niektóre wyszukiwania w Google doprowadziły mnie do ogólnej definicji histogramów . Rozumiem. Ale niestety nie mogę powiązać tej wiedzy z przykładami podanymi w dokumentach.

Aufwind
źródło

Odpowiedzi:

167

Bin to zakres reprezentujący szerokość pojedynczego słupka histogramu wzdłuż osi X. Możesz również nazwać to interwałem. (Wikipedia definiuje je bardziej formalnie jako „rozłączne kategorie”).

Funkcja Numpy histogramnie rysuje histogramu, ale oblicza wystąpienia danych wejściowych, które mieszczą się w każdym przedziale, co z kolei określa obszar (niekoniecznie wysokość, jeśli przedziały nie mają równej szerokości) każdego słupka.

W tym przykładzie:

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

Dostępne są 3 pojemniki na wartości z przedziału od 0 do 1 (z wyłączeniem 1.), 1 do 2 (z wyłączeniem 2) i 2 do 3 (w tym 3). Sposób, w jaki Numpy definiuje te pojemniki, jeśli podaje listę ograniczników ( [0, 1, 2, 3]) w tym przykładzie, chociaż zwraca również pojemniki w wynikach, ponieważ może wybierać je automatycznie z danych wejściowych, jeśli żadne nie są określone. Jeśli bins=5, na przykład, użyje 5 pojemników o równej 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 przedział „1 do 2” zawiera dwa wystąpienia (dwie 1wartości), a przedział „2 do 3” zawiera jedno wystąpienie ( 2). Wyniki te są w pierwszej pozycji w zwracanej krotki: array([0, 2, 1]).

Ponieważ pojemniki mają tutaj równą szerokość, możesz użyć liczby wystąpień dla wysokości każdego słupka. Po narysowaniu miałbyś:

  • słupek o wysokości 0 dla zakresu / przedziału [0,1] na osi X,
  • słupek o wysokości 2 dla zakresu / przedziału [1,2],
  • słupek o wysokości 1 dla zakresu / przedziału [2,3].

Możesz to wykreślić bezpośrednio za pomocą Matplotlib (jego histfunkcja zwraca również pojemniki 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()

wprowadź opis obrazu tutaj

Bruno
źródło
8
Możesz być również zainteresowany tą odpowiedzią, jeśli chcesz je wykreślić. Matplotlib może również obliczyć je bezpośrednio . Zobacz przykłady tutaj i tutaj .
Bruno
W zestawie danych kwiatów tęczówki, counts, bin_edges = np.histogram (iris_setosa ['petal_length'], bins = 10, density = True) podaje moje liczby w wartościach zmiennoprzecinkowych, zgodnie z podanym przykładem, w jaki sposób liczba może być wartość zmienna?
Dipen Gajjar
Najlepsza odpowiedź powinna uwzględniać fakt, że znaczna liczba wartości powyżej największej prawej krawędzi byłaby ignorowana. Zawsze dodawaj wartości powyżej krawędzi kraty do ostatniego kosza lub zmieniaj ostatnią ręcznie utworzoną binswartość na maksymalną wartość w szyku.
A.Ametov
@DipenGajjar Jeśli pominiesz „density = True”, nie zobaczysz tego. Słowo kluczowe density daje „znormalizowany” histogram, w którym reprezentowana jest funkcja gęstości prawdopodobieństwa. Możesz o tym przeczytać tutaj .
BUFU
67
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

Poniżej histwskazuje, że w skrzynce nr 0 znajduje się 0 towarów, w skrzynce nr 1 2, w skrzynce nr 3 4, w skrzynce nr 4 1.

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

bin_edges wskazuje, że przedział nr 0 to przedział [0,1), przedział nr 1 to [1,2), ..., przedział nr 3 to [3,4).

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

Pobaw się powyższym kodem, zmień wejście na np.histogrami 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()   

wprowadź opis obrazu tutaj

unutbu
źródło
4
Myślę, że byłoby to dokładniejsze: plt.bar(bin_edges[:-1], hist, width=1)oraz plt.xlim(min(bin_edges), max(bin_edges)), aby słupki pasowały do ​​ich oczekiwanej szerokości (w przeciwnym razie może istnieć po prostu mniejszy przedział bez wartości pomiędzy).
Bruno
Czy jest możliwe użycie "hist" uzyskanego w powyższym formacie numpy w funkcji "plt.hist (...)"? Ponieważ w metodzie słupkowej podajesz to jako "y", podczas gdy tutaj w hist jest tylko x ..
kbg
7

Inną użyteczną rzeczą numpy.histogramjest wykreślenie wyniku jako współrzędnych x i y na linegrafie. 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()

wprowadź opis obrazu tutaj

Może to być przydatny sposób wizualizacji histogramów, w których chciałbyś uzyskać wyższy poziom szczegółowości bez pasków wszędzie. Bardzo przydatne w histogramach obrazów do identyfikacji skrajnych wartości pikseli.

Grr
źródło
Jest to bardzo przydatne, aby zobaczyć rzuty wierszy i kolumn obrazu.
SKR