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

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

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

* Как работает функция гистограммы NumPy
* Как настроить количество и диапазон интервалов в результирующей гистограмме
* Как вернуть либо абсолютные значения, либо функцию плотности вероятности интервала

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

Содержание

* [Понимание функции гистограммы NumPy](#ponimanie-funkcii-gistogrammy-numpy)
* [Создание гистограммы с помощью NumPy в Python](#sozdanie-gistogrammy-s-pomoshyu-numpy-v-python)
* [Настройка ячеек в гистограммах NumPy](#nastroika-yacheek-v-gistogrammakh-numpy)
* [Настройка количества интервалов в гистограммах NumPy](#nastroika-kolichestva-intervalov-v-gistogrammakh-numpy)
* [Настройка диапазонов интервалов в гистограммах NumPy](#nastroika-diapazonov-intervalov-v-gistogrammakh-numpy)
* [Возврат функции плотности вероятности с помощью гистограмм NumPy](#vozvrat-funkcii-plotnosti-veroyatnosti-s-pomoshyu-gistogramm-numpy)
* [Изменение диапазона значений с помощью гистограмм NumPy](#izmenenie-diapazona-znachenii-s-pomoshyu-gistogramm-numpy)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

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

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

```python
# Понимание функции 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()`:

```python
# Генерация массива 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()` со значениями аргументов по умолчанию. Это позволит нам лучше понять, как функция работает:

```python
# Создание гистограммы с помощью 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.

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

```python
# Возвращение значений и интервалов с помощью 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 интервалов. Давайте посмотрим, как мы можем изменить функцию для создания пяти интервалов вместо десяти:

```python
# Настройка количества интервалов в гистограммах 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, которые имитируют возрастные группы:

```python
# Настройка интервалов гистограмм 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:

```python
# Вычисление функции плотности вероятности с помощью гистограмм 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:

```python
# Изменение диапазона значений в гистограммах 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. Сначала вы узнали, как работает функция, познакомившись с её параметрами и аргументами по умолчанию. Затем вы научились использовать функцию для создания гистограмм. После этого вы узнали, как настраивать количество и диапазоны интервалов. Вы также научились вычислять функцию плотности вероятности и как изменять общий диапазон значений.

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

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

* [Как нормализовать массивы NumPy](/neural/uchebniki-po-pandas-i-numpy/numpy/kak-normalizovat-massivy-numpy-minimalnoe-maksimalnoe-masshtabirovanie-z-ocenka-l2.md)
* [Как рассчитать процентили в NumPy с помощью np.percentile](/neural/uchebniki-po-pandas-i-numpy/pandas/pandas-quantile-raschet-procentilei-v-dataframe.md)
* [Numpy нормальное (гауссово) распределение (Numpy Random Normal)](/neural/uchebniki-po-pandas-i-numpy/numpy/raspredelenie-normalnogo-gaussova-raspredeleniya-v-numpy-sluchainoe-normalnoe-v-numpy.md)
* [Гистограмма NumPy: официальная документация](https://numpy.org/doc/stable/reference/generated/numpy.histogram.html)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bemind.gitbook.io/neural/uchebniki-po-pandas-i-numpy/numpy/izuchaem-funkciyu-np.histogram-v-numpy-sozdaem-gistogrammu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
