Як працює numpy.histogram ()?


120

Під час читання на numpy я стикався з функцією numpy.histogram().

Для чого це і як це працює? У документах вони згадують бункери : Що вони?

Деякий гуглінг привів мене до визначення гістограми взагалі . Я це розумію. Але, на жаль, я не можу пов'язати ці знання з прикладами, наведеними в документах.

Відповіді:


167

Бункер - це діапазон, який представляє ширину однієї смуги гістограми вздовж осі X. Ви також можете назвати цей інтервал. (Вікіпедія визначає їх формальніше як "непересічні категорії".)

Функція Numpy histogramне малює гістограму, але вона обчислює випадки вхідних даних, що потрапляють у кожну скриньку, що в свою чергу визначає площу (не обов'язково висоту, якщо бункери не однакової ширини) кожного бара.

У цьому прикладі:

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

Є 3 бункери для значень від 0 до 1 (без 1.), 1 до 2 (без 2) і 2 до 3 (в т. 3) відповідно. Спосіб Numpy визначає ці бункери, якщо [0, 1, 2, 3]в цьому прикладі подає список роздільників ( ), хоча він також повертає біни в результатах, оскільки він може вибирати їх автоматично з вхідних даних, якщо жодні не вказані. Якщо bins=5, наприклад, він буде використовувати 5 бункерів однакової ширини розкиду між вхідним значенням мінімального і максимального значення вхідного сигналу.

Вхідні значення дорівнюють 1, 2 і 1. Тому бін "1 до 2" містить два входження (два 1значення), а бін "2 до 3" містить один випадок (the 2). Ці результати в перший елемент в повернутому кортежі: array([0, 2, 1]).

Оскільки бункери тут однакової ширини, ви можете використовувати кількість вступів для висоти кожного бруска. Коли ви малюєте, у вас буде:

  • бар висоти 0 для дальності / бункера [0,1] на осі X,
  • бар висотою 2 для дальності / бункера [1,2],
  • брусок висотою 1 для дальності / бункера [2,3].

Ви можете побудувати це безпосередньо за допомогою Matplotlib (його histфункція також повертає бункери та значення):

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

введіть тут опис зображення


8
Вас також може зацікавити ця відповідь, якщо ви хочете їх скласти. Matplotlib також може їх обчислити безпосередньо . Дивіться приклади тут і тут .
Бруно

У наборі даних про кольори ірису підраховується, bin_edges = np.histogram (iris_setosa ['petal_length'], bins = 10, щільність = True) дає мені свої підрахунки у плаваючих значеннях, відповідно до прикладу, який ви подали, як можна вважати плаваюче значення?
Dipen Gajjar

Найкраща відповідь повинна враховувати, що значна кількість значень вище найбільшого правого краю буде ігнорована. Завжди додайте значення над краєм решіток до останнього біна або змінюйте останнє створене вручну binsзначення на максимальне значення масиву.
А.Аметов

@DipenGajjar Якщо ви опустите "щільність = True", ви цього не побачите. Ключове слово щільність дає "нормалізовану" гістограму, в якій представлена ​​функція щільності ймовірності. Про це можна прочитати тут .
BUFU

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

Нижче histвказується, що в кошику №0 є 0 предметів, 2 у кошику №1, 4 у кошику №3, 1 у кошику №4.

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

bin_edges вказує, що бін # 0 - інтервал [0,1), бін №1 - [1,2), ..., бін №3 - [3,4).

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

Пограйте з вищевказаним кодом, змініть вхід np.histogramі подивіться, як він працює.


Але картина варта тисячі слів:

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

введіть тут опис зображення


4
Я думаю, що це було б точніше: plt.bar(bin_edges[:-1], hist, width=1)і plt.xlim(min(bin_edges), max(bin_edges)), щоб бари підходили до їх очікуваної ширини (інакше, може бути просто менший контейнер без значень між ними).
Бруно

Чи можливо використовувати "hist", отриманий у наведеному вище форматі numpy, у функції "plt.hist (...)"? Тому що в бар-методі ви подаєте його як "у", тоді як тут, в історії, є лише х ..
kbg

7

Ще одна корисна річ numpy.histogram- це побудувати висновок у вигляді координат x та y на лінійному графіку. Наприклад:

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

введіть тут опис зображення

Це може бути корисним способом візуалізації гістограм там, де ви б хотіли більш високий рівень зернистості без брусків скрізь. Дуже корисний у гістограмах зображення для виявлення екстремальних значень пікселів.


Це дуже корисно для перегляду рядків та проекцій стовпців.
SKR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.