NumPy (Numerical Python) — открытая библиотека Python для работы с многомерными числовыми массивами. Ядро написано на C и C++, что даёт скорость до 50 раз выше стандартных списков. Весь современный стек науки о данных строится поверх неё: Pandas, SciPy и Scikit-learn зависят от NumPy напрямую.
Главный объект библиотеки — ndarray (N-dimensional array, многомерный массив). В отличие от Python-списка ndarray хранит данные в непрерывном блоке памяти с единым типом — это и есть причина его скорости. Меньше накладных расходов, больше вычислительной мощи.
Учитесь бесплатно за счёт государства
Экономия до 100 000 ₽ на любой программе
В статье разберём: что такое NumPy в Python, как его установить через pip или Anaconda, как работать с массивами ndarray, векторизацией, Broadcasting и срезами — с примерами кода и пояснениями. Попробовать NumPy без установки можно прямо сейчас — в Google Colab через браузер.
NumPy расшифровывается как Numerical Python. Библиотека распространяется под лицензией BSD и доступна бесплатно. При импорте её принято называть np — стандарт, принятый всем мировым сообществом Python-разработчиков.
Главное отличие от стандартного Python-списка — архитектурное. Список хранит указатели на разрозненные объекты в памяти. NumPy хранит данные как непрерывный блок в оперативной памяти, где все элементы одного типа лежат рядом. Процессор читает такой блок за один обращение к кешу (cache locality), а не прыгает по разным адресам. Кроме того, операции выполняет не интерпретатор Python, а скомпилированный код на C/C++.
Результат измерим: 820 мкс против 42 мс на массиве из миллиона элементов — разница примерно в 50 раз.
Три ключевых преимущества библиотеки:
В мире научных вычислений NumPy считают аналогом MATLAB в экосистеме Python: те же матричные операции, то же удобство работы с числами.

Библиотека NumPy используется везде, где нужны числовые вычисления над большими объёмами данных.
Data Science. Анализ поведения пользователей, A/B-тесты, обработка временных рядов — всё начинается с массивов NumPy, которые Pandas превращает в таблицы.
Машинное обучение. Веса нейронных сетей, входные признаки для Scikit-learn, матрицы активаций — везде ndarray. Без NumPy в Python нет современного машинного обучения.
Научные исследования. Геномика, физические симуляции, обработка изображений, анализ данных телескопов. SciPy расширяет NumPy именно для этих задач.
Матричные вычисления. Линейная алгебра, трансформации координат, трёхмерная графика.
Отдельная задача — обработка пропущенных значений. В NumPy они представлены как np.nan (Not a Number, не является числом) с типом float. Пропуски встречаются в любом реальном наборе данных: незаполненные поля анкеты, сбои датчиков, отсутствующие записи. NumPy позволяет их находить и обрабатывать без удаления строк целиком.
Библиотека нужна аналитикам данных, инженерам машинного обучения, учёным — всем, кто работает с числами в Python.
Для установки NumPy в Python существует три пути: через менеджер пакетов pip, через дистрибутив Anaconda или средствами интегрированной среды разработки. После установки стандартный импорт выглядит так:
import numpy as np
Псевдоним np — повсеместный стандарт: его используют в документации, на форумах, в учебниках. Проверить корректность установки просто:
print(np.__version__) # например, 1.26.4
pip — самый распространённый способ. Одна команда в терминале:
pip install numpy
Если используете виртуальное окружение (venv или Poetry) — выполняйте команду внутри него, чтобы библиотека установилась именно в нужный проект.

Anaconda — дистрибутив Python для Data Science. NumPy уже предустановлен в базовой поставке Anaconda. Если потребуется обновить или установить отдельно:
conda install numpy
IDE. В PyCharm и VS Code при открытии файла с import numpy среда предложит установить отсутствующий пакет автоматически. Для работы с NumPy в Python также удобен Jupyter Notebook: запускается командой jupyter notebook, поддерживает %timeit для замера скорости прямо в ячейке.
Google Colab — бесплатная облачная среда для работы с Python прямо в браузере. NumPy там уже установлен: откройте новый ноутбук на colab.research.google.com, введите import numpy as np и начинайте работать. Ничего скачивать не нужно, требуется только аккаунт Google. Удобный старт для тех, кто впервые знакомится с NumPy в Python.

[IMAGE: image_5]
Основной объект библиотеки — ndarray (N-dimensional array, многомерный массив). Это не просто список чисел: ndarray — строго однородная структура, где все элементы имеют одинаковый тип данных (dtype), а данные лежат в непрерывном блоке оперативной памяти.
NumPy поддерживает массивы любой размерности:
Создать ndarray из Python-списка просто:
import numpy as np
a = np.array([1, 2, 3, 4, 5]) # вектор 1D
b = np.array([[1, 2, 3], [4, 5, 6]]) # матрица 2D
Каждый ndarray несёт набор атрибутов, которые описывают его структуру. Знать их обязательно — 90% ошибок новичков связаны с несовпадением форм (shape mismatch).
| Атрибут |
Что возвращает |
Пример значения |
|---|---|---|
| .ndim | количество измерений | 2 (матрица) |
| .shape | кортеж размеров по каждой оси | (3, 4) — 3 строки, 4 столбца |
| .dtype | тип данных элементов | float64, int32 |
| .size | общее число элементов | 12 |
| .itemsize | размер одного элемента в байтах | 8 (float64) |
| .nbytes | общий объём данных в байтах | 96 (= 12 × 8) |
.ndim = 1 — вектор, 2 — матрица, 3 — тензор. .shape — главный атрибут при отладке: его проверяют в первую очередь при любой ошибке формы. .nbytes удобен для контроля памяти: если массив занимает несколько гигабайт, стоит понизить точность с float64 до float32.
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float64)
print(arr.shape) # (2, 3)
print(arr.itemsize) # 8
print(arr.nbytes) # 48
NumPy поддерживает несколько числовых типов, и от выбора зависит расход памяти:
Задать тип явно:
arr = np.array([1, 2, 3], dtype=np.int16) # экономия памяти
Проблема upcasting возникает, когда в массиве оказываются элементы разных типов. NumPy автоматически приводит всё к самому «широкому» типу. Если в числовой массив попадает строка — все элементы превращаются в строки, массив теряет математические операции:
bad = np.array([1, 2, «три»]) # dtype='<U21′, арифметика недоступна
Приводите тип явно через .astype():
arr = arr.astype(np.float64)
print(arr.dtype) # float64
Создавать ndarray вручную из Python-списков удобно для небольших примеров. В реальных задачах Data Science чаще применяют встроенные генераторы: они быстрее, лаконичнее и не требуют ручного ввода тысяч чисел. NumPy предоставляет набор готовых функций для создания массивов любой структуры и размерности.

Ключевые функции с пояснениями:
np.array(list) — создаёт ndarray из Python-списка, поддерживает 1D и 2D:
np.array([1, 2, 3])
np.array([[1, 2], [3, 4]])
np.zeros(shape) и np.ones(shape) — заготовки для заполнения. Удобны, когда размер известен заранее, а данные будут записаны позже:
np.zeros((3, 4)) # матрица 3×4 из нулей
np.ones((2, 3)) # матрица 2×3 из единиц
np.full(shape, value) — заполняет произвольным значением:
np.full((3, 3), 7) # матрица 3×3, все элементы = 7
np.arange(start, stop, step) — аналог Python range(), но поддерживает дробный шаг:
np.arange(0, 1, 0.1) # [0.0, 0.1, 0.2, …, 0.9]
np.linspace(start, stop, num) — задаёте количество точек, шаг рассчитывается сам; конечная граница включена:
np.linspace(0, 1, 11) # 11 равномерных точек от 0 до 1
Для построения графиков предпочтительнее linspace; для целочисленных последовательностей — arange.
np.eye(n) — единичная матрица (диагональ из единиц, остальное нули):
np.eye(3) # матрица 3×3 единичная
Модуль np.random генерирует случайные данные — незаменим при тестировании кода и инициализации весов нейронных сетей:
np.random.rand(3, 4) # матрица 3×4, равномерное [0, 1)
np.random.randint(0, 10, size=(3, 4)) # целые числа от 0 до 9
np.random.randn(3, 4) # нормальное распределение μ=0, σ=1
Важная деталь: rand и randn принимают размер числами через запятую, а randint — через параметр size=(n, m). Это расходится с zeros/ones, где форма передаётся кортежем — частая ошибка при переходе между функциями.
Доступ к элементам ndarray работает по тому же принципу, что и в Python-списках — индексация с нуля. Для одномерного массива: arr[2] — третий элемент, arr[1:5] — срез со второго по пятый.
Для двумерных массивов NumPy использует запятую вместо вложенных скобок — это лаконичнее и быстрее:
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix[0, 1] # 2 — первая строка, второй столбец
matrix[0, :] # [1, 2, 3] — вся первая строка
matrix[:, 0] # [1, 4, 7] — весь первый столбец
matrix[0:2, 1:3] # подматрица: строки 0–1, столбцы 1–2
Изменить значения через присваивание:
matrix[0, 0] = 99 # изменяет элемент в исходном массиве
matrix[:, 1] = 0 # обнуляет второй столбец

Булева индексация — один из самых мощных инструментов NumPy. Условие применяется к массиву, возвращает маску из значений True и False, затем маска используется как индекс:
data = np.array([10, 25, 40, 55, 70])
data[data > 30] # [40, 55, 70]
data[(data > 20) & (data < 60)] # [25, 40, 55]
Три оператора для комбинирования условий:
Хотите сменить профессию или повысить квалификацию?
Федеральный проект «Активные меры содействия занятости» даёт возможность пройти обучение бесплатно за счёт государства
Условия в круглых скобках — обязательно, иначе Python вычислит неверный приоритет операций.
Именно этот механизм лежит в основе фильтрации в Pandas: когда вы пишете df[df[‘age’] > 30], под капотом работает та же булева маска NumPy.
Векторизация — это применение операции ко всему массиву без цикла for. Операция выполняется на уровне скомпилированного кода C, а не построчно через интерпретатор Python:
prices = np.array([100, 200, 300, 400])
prices + 50 # [150, 250, 350, 450] — скаляр к каждому
prices * 0.9 # скидка 10% на все позиции
np.sqrt(prices) # квадратный корень поэлементно
Бенчмарк: суммирование миллиона элементов — 820 мкс через NumPy против 42 мс через цикл Python. Разница — 50 раз. Именно поэтому в профессиональном коде цикл for по числовому массиву считается антипаттерном.
Важное различие операторов умножения:
Broadcasting (трансляция) — механизм применения операций к массивам разных форм. NumPy виртуально «растягивает» меньший массив до формы большего без реального копирования данных в памяти:
matrix = np.ones((3, 3))
row = np.array([1, 2, 3]) # форма (3,)
matrix + row # row «растягивается» по строкам — Broadcasting

Правило совместимости форм: размеры по каждой оси либо равны, либо один из них равен 1. Если условие не выполняется — NumPy выдаст ValueError: operands could not be broadcast together.
NumPy предоставляет функции агрегации: sum, mean, max, min, median, std, var, prod. Без указания axis функция схлопывает весь массив до одного числа — скаляра.
| Функция |
Что считает |
Синтаксис с axis |
|---|---|---|
| np.sum() | сумма элементов | np.sum(arr, axis=0) |
| np.mean() | среднее значение | np.mean(arr, axis=1) |
| np.max() / np.min() | максимум / минимум | np.max(arr, axis=0) |
| np.median() | медиана | np.median(arr, axis=1) |
| np.std() | стандартное отклонение | np.std(arr, axis=0) |
| np.var() | дисперсия | np.var(arr, axis=1) |

Параметр axis — один из самых частых источников путаницы. Вот мнемоника: axis — это ось, которую мы уничтожаем при агрегации.
Возьмём матрицу продаж (2, 3): 2 магазина, 3 дня:
sales = np.array([[10, 20, 30], # магазин 1
[40, 50, 60]]) # магазин 2
sales.sum(axis=0) # [50, 70, 90] — сумма по каждому дню
sales.sum(axis=1) # [60, 150] — сумма по каждому магазину
axis=0 — движение сверху вниз, уничтожаем строковое измерение, результат получается по столбцам. axis=1 — движение слева направо, уничтожаем столбцовое измерение, результат получается по строкам.
Мнемоника универсальна: она работает с mean, max, min, std, var и всеми остальными агрегаторами одинаково.

Метод reshape меняет форму массива, не затрагивая данные. Он не создаёт копию — возвращает представление (view) того же блока памяти. Условие одно: общее количество элементов должно сохраняться, иначе NumPy выдаст ValueError.
arr = np.arange(12) # [0, 1, 2, …, 11]
matrix = arr.reshape(3, 4) # матрица 3 строки × 4 столбца
Лайфхак -1: если один из размеров можно не вычислять вручную — поставьте -1, NumPy рассчитает его сам:
arr.reshape(-1, 2) # NumPy считает: строк будет 6
arr.reshape(3, -1) # NumPy считает: столбцов будет 4
Применение в машинном обучении: Scikit-learn требует двумерный вход (n_samples, n_features). Одномерный вектор признаков — reshape(-1, 1) приводит его в нужную форму. Перед свёрточной нейронной сетью пиксели изображения выравниваются через reshape(n, -1).
NumPy позволяет объединять массивы несколькими способами:
| Функция |
Ось |
Описание |
|---|---|---|
| np.concatenate([a, b], axis=0) | 0 или 1 | универсальное объединение |
| np.vstack([a, b]) | 0 (вертикально) | удобное сокращение для строк |
| np.hstack([a, b]) | 1 (горизонтально) | удобное сокращение для столбцов |
| np.dstack([a, b]) | 2 (по глубине) | третья ось, для 3D-массивов |
| np.stack([a, b], axis=0) | новая ось | создаёт новое измерение |
Критически важно — разница между ссылкой и копией:
a = np.array([1, 2, 3])
b = a # b — ссылка, не копия!
b[0] = 99
print(a) # [99, 2, 3] — исходный изменился
c = a.copy() # c — независимая копия
c[0] = 0
print(a) # [99, 2, 3] — исходный не тронут
В пайплайнах машинного обучения это частая ошибка: трансформации промежуточного массива неожиданно портят исходные данные. Правило простое — нужна независимая копия, всегда используйте .copy().
Евклидово расстояние. Мера схожести двух векторов — основа алгоритмов kNN и кластеризации. Формула: √(Σ(a − b)²):
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
distance = np.sqrt(np.sum((a — b) ** 2))
print(distance) # 5.196
Этот инструмент не имеет прямого аналога в стандартном Python — его считают именно через NumPy.
Транспонирование матрицы. Поворот матрицы — строки становятся столбцами. Применяется при смене ориентации датасета и обработке изображений:
matrix = np.array([[1, 2, 3], [4, 5, 6]]) # форма (2, 3)
matrix.T # форма (3, 2) — компактно
np.transpose(matrix) # эквивалентный вызов функцией
Обработка пропущенных значений NaN. np.nan — специальный маркер для пропусков с типом float. NumPy предоставляет функции, которые игнорируют пропуски при вычислениях:
data = np.array([1.0, np.nan, 3.0, np.nan, 5.0])
clean = data[~np.isnan(data)] # фильтрация пропусков: [1., 3., 5.]
mean_val = np.nanmean(data) # среднее без учёта NaN: 3.0
Матричное умножение: * против @. Ошибочное применение поэлементного умножения вместо матричного — классический баг в линейной алгебре:
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
A * B # [[5, 12], [21, 32]] — поэлементно
A @ B # [[19, 22], [43, 50]] — матричное произведение

NumPy — фундамент всего стека науки о данных в Python. Остальные библиотеки либо строятся поверх него, либо принимают ndarray на входе.
Pandas создаёт DataFrame поверх NumPy-массивов. Когда вы работаете с колонками и строками Pandas, под капотом — ndarray.
SciPy расширяет NumPy для научных вычислений: оптимизация, интегрирование, обработка сигналов, статистические тесты.
Scikit-learn принимает ndarray на вход во все алгоритмы машинного обучения: классификация, регрессия, кластеризация — все работают с NumPy-массивами.
Matplotlib и Seaborn строят графики напрямую по ndarray без промежуточных преобразований.
Когда использовать NumPy напрямую: числовые вычисления, линейная алгебра, подготовка данных для моделей. Когда переходить на Pandas: данные табличные, с заголовками столбцов, смешанными типами и датами — там нужен DataFrame.
Официальная документация доступна на numpy.org/doc/ — там же интерактивные примеры и руководство для начинающих.
Следующий шаг в стеке: освоив NumPy в Python, переходите к Pandas (табличные данные), затем Matplotlib (визуализация) и Scikit-learn (модели машинного обучения). Практиковаться удобнее всего в Google Colab или локальном Jupyter Notebook — запускаете ячейки, видите результат сразу.
Если хотите освоить работу с данными системно — в рамках федерального проекта «Активные меры содействия занятости» доступна программа «Специалист по аналитике и базам данных в информационных системах» (72 часа, с нуля, онлайн). Финансирование государственное по нацпроекту «Кадры», старт в июле. Подробнее — в каталоге программ обучения.
Хотите освоить аналитику данных системно — от Python и NumPy до построения полноценных отчётов? В рамках федерального проекта «Активные меры содействия занятости» это возможно без вложений. Программа «Специалист по аналитике и базам данных в информационных системах» — онлайн, с нуля, с официальным документом государственного образца. Смотрите каталог доступных программ.
np — стандартный псевдоним при импорте библиотеки: import numpy as np. Технически можно задать любое имя, но np — де-факто стандарт мирового сообщества. Его используют в официальной документации, на Stack Overflow, в учебниках. Две буквы экономят время и делают код мгновенно читаемым для любого коллеги.
NumPy хранит данные в непрерывном блоке памяти с единым типом — скорость до 50 раз выше, значительная экономия оперативной памяти. Python-список хранит указатели на разрозненные объекты, поддерживает смешанные типы, но медленнее при вычислениях. При больших наборах данных список может вызвать ошибку нехватки памяти (OOM), ndarray — нет.
Выполните в консоли: import numpy as np; print(np.__version__). Если выводится номер версии (например, 1.26.4) — библиотека работает. Если появляется ModuleNotFoundError — установите через pip install numpy или conda install numpy для Anaconda.
dtype — тип данных всех элементов ndarray. Если в массив попадают элементы разных типов, NumPy применит upcasting — приведёт всё к самому широкому типу. Числа плюс строка — массив теряет математические операции. Задавайте тип явно: np.array([1, 2, 3], dtype=np.float32). Выбор dtype также влияет на расход памяти: int16 — 2 байта, float64 — 8 байт.
Broadcasting позволяет применять операции к массивам разной формы: NumPy виртуально «растягивает» меньший массив без создания копии в памяти. Срабатывает, если формы совместимы: размеры по каждой оси либо равны, либо один из них равен 1. Пример: matrix + np.array([1, 2, 3]) дублирует вектор по строкам матрицы автоматически.
Мнемоника: axis — это ось, которую вы «уничтожаете» при агрегации. axis=0 — движение сверху вниз, схлопываем строки, результат по столбцам. axis=1 — движение слева направо, схлопываем столбцы, результат по строкам. Правило одинаково работает для sum, mean, max, min, std и всех остальных агрегаторов.
Присваивание b = a передаёт ссылку на тот же объект в памяти, не данные. Изменение b изменит и a. Для независимой копии используйте b = a.copy(). В пайплайнах машинного обучения это критически важно: без .copy() трансформации промежуточного массива будут неожиданно затрагивать исходные данные.
np.arange(start, stop, step) — задаёте шаг, количество точек рассчитывается автоматически; поддерживает дробный шаг в отличие от Python range(). np.linspace(start, stop, num) — задаёте количество точек, шаг рассчитывается сам; конечная граница включена. Для построения графиков предпочтительнее linspace, для целочисленных последовательностей — arange.
Подайте заявку —
забронируйте место в группе
45 000 мест на 2026 год. Бесплатное обучение по федеральному проекту «Активные меры содействия занятости»