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

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

107 голосов
/ 04 февраля 2012

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

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

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

Ответы [ 3 ]

152 голосов
/ 04 февраля 2012

Контейнер представляет собой диапазон, представляющий ширину одного столбца гистограммы вдоль оси 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()

enter image description here

60 голосов
/ 04 февраля 2012
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

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

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

bin_edges указывает, что bin # 0 - это интервал [0,1), bin # 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()   

enter image description here

4 голосов
/ 29 декабря 2017

Еще одна полезная вещь, которую нужно сделать с 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()

enter image description here

Это может быть полезным способом визуализации гистограмм там, где вам нужен более высокий уровень детализации без баров везде.Очень полезно в гистограммах изображений для определения экстремальных значений пикселей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...