Изучаем функцию np.histogram в NumPy: создаем гистограмму

В этом учебнике вы научитесь использовать функцию гистограммы NumPy для вычисления гистограммы заданного набора данных. Гистограмма показывает частоту числовых данных в пределах группированных диапазонов. Используя NumPy для расчета гистограмм, вы можете легко вычислить и получить доступ к частотам (относительным или абсолютным) различных значений.

К концу этого учебного пособия вы узнаете:

  • Как работает функция гистограммы NumPy

  • Как настроить количество и диапазон интервалов в результирующей гистограмме

  • Как вернуть либо абсолютные значения, либо функцию плотности вероятности интервала

Если вы хотите научиться проверять, является ли распределение нормальным, ознакомьтесь с моим руководством по использованию Python для тестирования на нормальность

Содержание

Понимание функции гистограммы NumPy

В этом разделе вы узнаете о функции np.histogram() и различных параметрах и аргументах по умолчанию, которые предлагает эта функция. Функция имеет шесть различных параметров, один из которых является обязательным. Давайте посмотрим, как выглядит функция:

# Понимание функции np.histogram() из библиотеки NumPy
import numpy as np

np.histogram(a, bins=10, range=None, normed=None, weights=None, density=None)

Функция np.histogram() вычисляет гистограмму данных, разбивая их на равные интервалы. Возвращает два массива: массив гистограммы (число элементов в каждом интервале) и массив с границами интервалов.

Мы видим, что функция предоставляет ряд различных параметров. В таблице ниже представлены параметры и их аргументы по умолчанию:

ПараметрОписаниеАргумент по умолчаниюПринятые значения

a=

Входные данные, где гистограмма рассчитывается по сплющенному массиву.

N/A

array-like

bins=

Количество интервалов одинаковой ширины или диапазонов, которые будут использоваться в качестве интервалов.

10

int or sequence

range=

Нижний и верхний диапазон значений

None

(float, float)

normed=

Эквивалент аргумента плотности (устарел с версии 1.6.0). Будет давать неправильные результаты, если контейнеры неравны.

None

bool

weights=

Массив весов той же формы, что и a, где каждое значение имеет только связанный с ним вес.

None

array-like

density=

Если значение равно False, возвращается количество выборок в каждом интервале. Если True, возвращает функцию плотности вероятности в интервале.

None

bool

Теперь, когда у вас есть хорошее понимание того, как функция работает, давайте посмотрим, как ее можно использовать.

Создание гистограммы с помощью NumPy в Python

В этом разделе вы узнаете, как создать базовую гистограмму с помощью функции гистограммы NumPy. Для этого давайте создадим массив случайных значений от 0 до 100, используя функцию np.random.randint():

# Генерация массива NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))
print(arr)

# Returns:
# [  8  24  67  87  79  48  10  94  52  98  53  66  98  14  34  24  15 100
#   60  58  16   9  93  86   2  27   4  31   1  13  83 100   4  91  59  67
#    7  49  47  65  61  14  55  71  80   2  94  19  98  63  53  27  56  30
#   48  47  39  38  44  18  64  56  34  53  74  17  72  13  30  17  53  68
#   50  91  91  83  53  78   0  13  57  76   3  70   3  84  79  10  87  60
#    3  48  52  43  36   5  71  38  86  94]

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Функция np.random.seed(100) используется для установки начального состояния генератора случайных чисел для воспроизводимости результатов.

Мы сгенерировали массив после создания начального числа. Использование функции np.random.seed() позволяет нам генерировать воспроизводимые результаты. Теперь, когда у нас есть наш массив, давайте передадим его в функцию np.histogram() со значениями аргументов по умолчанию. Это позволит нам лучше понять, как функция работает:

# Создание гистограммы с помощью np.histogram()
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

print(np.histogram(arr))

# Returns:
# (array([13, 13,  4,  9,  8, 14, 10,  9,  8, 12]), array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.]))

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция np.histogram() вычисляет гистограмму этого массива. Результатом будет кортеж из двух массивов: массив гистограммы (число элементов в каждом интервале) и массив с границами интервалов.

Давайте разберем, что делает приведенный выше код:

  1. Мы загружаем наш массив таким же образом, как это делали ранее. Обратите внимание, что наши значения включают минимальное значение 0 и максимальное значение 100.

  2. Затем мы передаём этот массив в функцию np.histogram() и печатаем результаты.

Функция возвращает два массива: (1) количество значений, попавших в каждый интервал, и (2) границы интервалов. Все границы интервалов являются полуоткрытыми, за исключением последней пары. Это означает, что первый интервал начинается от 0 включительно до 10 исключительно, и так далее.

Из результатов видно, что 13 значений попадают в первый интервал, что означает, что 13 значений находятся в диапазоне [0, 10). Поскольку аргумент по умолчанию для функции - bins=10, интервалы охватывают диапазон от минимального значения (0) до максимального значения (100), деленный на 10.

Поскольку функция возвращает два значения, мы можем присвоить каждый из результатов своим переменным, как показано ниже:

# Возвращение значений и интервалов с помощью np.histogram()
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr)

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([13, 13,  4,  9,  8, 14, 10,  9,  8, 12])
# bin_edges=array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция np.histogram() вычисляет гистограмму этого массива. Переменная hist содержит массив гистограммы (число элементов в каждом интервале), а переменная bin_edges содержит массив с границами интервалов.

В приведенном выше коде мы использовали f-строки Python для аккуратного вывода переменных (эта функция доступна только в Python 3.8+). Теперь, когда вы видели, что производит функция с её аргументами по умолчанию, давайте посмотрим, как вы можете настроить функцию, изменяя параметр bins=

Настройка ячеек в гистограммах NumPy

В этом разделе вы научитесь настраивать разбиение на корзины в гистограммах NumPy. По умолчанию функция гистограммы NumPy использует параметр bins=10. Это означает, что NumPy разделит диапазон значений на десять корзин одинакового размера.

Настройка количества интервалов в гистограммах NumPy

Мы можем изменить количество интервалов в гистограмме NumPy, передав целое число в аргумент bins=. Как было сказано ранее, по умолчанию NumPy создает 10 интервалов. Давайте посмотрим, как мы можем изменить функцию для создания пяти интервалов вместо десяти:

# Настройка количества интервалов в гистограммах NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr, bins=5)

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([26, 13, 22, 19, 20])
# bin_edges=array([  0.,  20.,  40.,  60.,  80., 100.])

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция np.histogram() вычисляет гистограмму этого массива, используя 5 интервалов. Переменная hist содержит массив гистограммы (число элементов в каждом интервале), а переменная bin_edges содержит массив с границами интервалов.

В следующем разделе вы узнаете, как настроить диапазоны ячеек.

Настройка диапазонов интервалов в гистограммах NumPy

Функция гистограммы NumPy также позволяет вручную определять края корзин. Преимущество этого заключается в том, что это позволяет настраивать корзины неравного размера. Это может быть особенно полезно, если вы работаете с категориальными данными, такими как возрастные группы.

Давайте посмотрим, как мы можем определить некоторые логические интервалы для нашей гистограммы NumPy, которые имитируют возрастные группы:

# Настройка интервалов гистограмм NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr, bins=[arr.min(), 18, 65, arr.max()])

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([24, 42, 34])
# bin_edges=array([  0,  18,  65, 100])

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция np.histogram() вычисляет гистограмму этого массива, используя пользовательские интервалы [минимальное значение массива, 18, 65, максимальное значение массива]. Переменная hist содержит массив гистограммы (число элементов в каждом интервале), а переменная bin_edges содержит массив с границами интервалов.

В NumPy края будут определены как включающие левую границу и исключающие правую. Это означает, что левая граница будет включена, а все значения до (но не включая) правой границы также будут учтены.

Возврат функции плотности вероятности с помощью гистограмм NumPy

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

Давайте посмотрим, как мы можем вернуть функцию плотности вероятности в гистограммах NumPy:

# Вычисление функции плотности вероятности с помощью гистограмм NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr, density=True)

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([0.013, 0.013, 0.004, 0.009, 0.008, 0.014, 0.01 , 0.009, 0.008,     0.012])
# bin_edges=array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция np.histogram() вычисляет гистограмму этого массива с нормализацией (density=True), что приводит к вычислению функции плотности вероятности вместо числа элементов в каждом интервале. Переменная hist содержит массив значений функции плотности вероятности, а переменная bin_edges содержит массив с границами интервалов.

В следующем разделе вы узнаете, как изменить диапазон значений, который охватывает гистограмма NumPy.

Изменение диапазона значений с помощью гистограмм NumPy

По умолчанию NumPy будет включать в гистограммы, создаваемые функцией np.histogram(), весь диапазон значений. Вы можете изменить это поведение, задав параметру range= кортеж из чисел с плавающей точкой.

Давайте посмотрим, как мы можем изменить поведение функции, чтобы она показывала только значения от 0 до 50:

# Изменение диапазона значений в гистограммах NumPy
import numpy as np

np.random.seed(100)
arr = np.array(np.random.randint(0, 101, 100))

hist, bin_edges = np.histogram(arr, range=(0.0, 50.0))

print(f'{hist=}')
print(f'{bin_edges=}')

# Returns:
# hist=array([9, 4, 7, 6, 2, 2, 5, 4, 2, 7])
# bin_edges=array([ 0.,  5., 10., 15., 20., 25., 30., 35., 40., 45., 50.])

Этот код использует библиотеку NumPy для генерации массива случайных чисел размером 100 из диапазона от 0 до 100. Затем функция np.histogram() вычисляет гистограмму этого массива с заданным диапазоном значений от 0.0 до 50.0. Переменная hist содержит массив гистограммы (число элементов в каждом интервале), а переменная bin_edges содержит массив с границами интервалов.

Заключение

В этом уроке вы научились использовать функцию np.histogram() для создания гистограмм в NumPy. Сначала вы узнали, как работает функция, познакомившись с её параметрами и аргументами по умолчанию. Затем вы научились использовать функцию для создания гистограмм. После этого вы узнали, как настраивать количество и диапазоны интервалов. Вы также научились вычислять функцию плотности вероятности и как изменять общий диапазон значений.

Дополнительные ресурсы

Чтобы узнать больше о связанных темах, ознакомьтесь с нижеприведенными руководствами:

Last updated