Как работает numpy.histogram ()?


121

Читая numpy, я столкнулся с функцией numpy.histogram().

Для чего это и как работает? В документах упоминаются ящики : что это такое?

Некоторый поиск в Google привел меня к определению гистограмм в целом . Я понимаю. Но, к сожалению, я не могу связать эти знания с примерами, приведенными в документации.

Ответы:


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» содержит одно вхождение ( 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 также может вычислить их напрямую . См. Примеры здесь и здесь .
Бруно

В наборе данных цветов ириса counts, bin_edges = np.histogram (iris_setosa ['petal_length'], bins = 10, density = True) дает мне мои подсчеты в плавающих значениях, согласно приведенному вами примеру, как подсчет может быть плавающее значение?
Дипен Гаджар

При выборе лучшего ответа следует учитывать, что значительное количество значений выше самого правого края будет проигнорировано. Всегда добавляйте значения над краем решетки в последнюю корзину или изменяйте последнее созданное вручную binsзначение на максимальное значение в массиве.
А.Аметов

@DipenGajjar Если вы опустите "density = True", вы этого не увидите. Ключевое слово density дает вам "нормализованную" гистограмму, в которой представлена ​​функция плотности вероятности. Вы можете прочитать об этом здесь .
BUFU

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

Ниже histуказано, что в корзине №0 находится 0 элементов, в лотке №1 - 2, в лотке №4 - 4, в лотке №4 - 1.

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 (...)"? Потому что в методе bar вы указываете его как «y», а здесь, в hist, только x ..
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.