Изучаем функцию 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()
вычисляет гистограмму этого массива. Результатом будет кортеж из двух массивов: массив гистограммы (число элементов в каждом интервале) и массив с границами интервалов.
Давайте разберем, что делает приведенный выше код:
Мы загружаем наш массив таким же образом, как это делали ранее. Обратите внимание, что наши значения включают минимальное значение 0 и максимальное значение 100.
Затем мы передаём этот массив в функцию
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