Jak numpy.histogram () działa?

Podczas czytania na numpy natknąłem się na funkcję numpy.histogram().

Do czego to służy i Jak to działa? W dokumentach wspominają kosze : czym one są?

Jakieś googlowanie doprowadziło mnie do definicji histogramów w ogóle . Rozumiem. Ale niestety nie mogę połączyć tej wiedzy z przykładami podanymi w dokumentach.

Author: Salvador Dali, 2012-02-04

3 answers

Bin to zakres, który reprezentuje szerokość pojedynczego paska histogramu wzdłuż osi X. Można to również nazwać interwałem. (Wikipedia definiuje je bardziej formalnie jako "rozdzielone kategorie".)

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

W tym przykład:

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

Są 3 pojemniki, dla wartości z zakresu od 0 do 1 (z wyłączeniem 1.), 1 do 2 (wył. 2) i od 2 do 3 (w tym 3), odpowiednio. Sposób, w jaki Numpy definiuje te pojemniki if, podając listę ograniczników ([0, 1, 2, 3]) w tym przykładzie, chociaż zwraca również pojemniki w wynikach, ponieważ może wybrać je automatycznie z wejścia, jeśli nie podano żadnego. If bins=5, na przykład, użyje 5 pojemników o jednakowej szerokości rozłożonych między minimalną wartością wejściową a maksymalną wartością wejściową wartość.

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). Wyniki te znajdują się w pierwszej pozycji zwracanej krotki: array([0, 2, 1]).

Ponieważ kosze mają jednakową szerokość, możesz użyć liczby wystąpień dla wysokości każdego słupka. Po wylosowaniu mielibyście:

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

Możesz to wykreślić bezpośrednio za pomocą Matplotlib (jej hist funkcja zwraca również wartości i Biny):

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

Tutaj wpisz opis obrazka

 132
Author: Bruno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
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))

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

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

bin_edges wskazuje, że bin # 0 jest interwałem [0,1), bin #1 jest [1,2),..., bin #3 to [3,4].

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

Pobaw się powyższym kodem, Zmień wejście 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()   

Tutaj wpisz opis obrazka

 57
Author: unutbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-04 17:07:07

Kolejną użyteczną rzeczą do zrobienia z numpy.histogram jest wykreślenie wyjścia jako współrzędnych X i y na wykresie linegrafu. 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()

Tutaj wpisz opis obrazka

Może to być użyteczny sposób wizualizacji histogramów, w których chcesz uzyskać wyższy poziom ziarnistości bez wszędzie pasków. Bardzo przydatne w histogramach obrazu do identyfikacji skrajnych wartości pikseli.

 3
Author: Grr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 21:33:14