Menu
CoddyTech

Шпаргалка по NumPy

Последнее обновление

Создание массивов

Массив хранит значения одного типа в сетке с любым числом измерений.

ЗадачаКод
Импорт NumPyimport numpy as np
Из спискаnp.array([1, 2, 3])
2D из вложенных списковnp.array([[1, 2, 3], [4, 5, 6]])
Нули, единицы, одно значениеnp.zeros((2, 3)), np.ones(4), np.full((2, 2), 7)
Диапазон с шагом (без конца)np.arange(0, 10, 2) # [0 2 4 6 8]
n равноотстоящих точек (с концом)np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1.]
Единичная матрицаnp.eye(3)
Той же формы, что другой массивnp.zeros_like(m), np.ones_like(m)
Задать тип элементовnp.array([1, 2, 3], dtype=np.float32)
Координатные сеткиxx, yy = np.meshgrid(np.arange(3), np.arange(2))

Свойства массива

ЗадачаКод
Форма: размер каждого измеренияm.shape # (3, 4)
Число измеренийm.ndim # 2
Число элементовm.size # 12
Тип элементовm.dtype # int64
Преобразовать типm.astype(np.float64)
Длина первого измеренияlen(m) # 3
Обратно в список Pythonm.tolist()
Печатать меньше знаков после запятойnp.set_printoptions(precision=3, suppress=True)

Индексы и срезы

Срезы это представления (view): они делят память с исходным массивом. Маски и списки индексов возвращают копии.

ЗадачаКод
Первый и последний элементa[0], a[-1]
Срез start:stop (без stop)a[1:4] # [20 30 40]
Каждый второй, в обратном порядкеa[::2], a[::-1]
Один элемент 2D-массиваm[1, 2] # 6
Строка, столбецm[0], m[:, 1]
Блок строк и столбцовm[:2, 1:3]
Элементы по условиюa[a > 25] # [30 40 50]
Несколько условийa[(a > 15) & (a < 45)]
Выбор по списку позицийa[[0, 2, 4]]
Позиции, где условие выполненоnp.flatnonzero(a > 25) # [2 3 4]
Выбор для каждого элементаnp.where(a > 25, a, 0)
Копия перед изменением срезаpart = a[1:3].copy()
Задать значения по маскеa[a > 40] = 0

Математика и broadcasting

Операторы работают поэлементно. Broadcasting растягивает скаляр, строку или столбец до формы другого массива.

ЗадачаКод
Поэлементная арифметикаx + y, x - y, x * y, x / y, x ** 2
Со скаляромx * 10
Корень, экспонента, логарифмnp.sqrt(x), np.exp(x), np.log(x)
Модуль, округлениеnp.abs(x - 5), np.round(x / 3, 2)
Ограничить значения диапазономnp.clip(x, 2, 8)
Поэлементный максимумnp.maximum(x, 3)
Скалярное произведениеx @ y # 37.0
Центрировать столбцы (broadcast строки)m - m.mean(axis=0)
Масштабировать строки (broadcast столбца)m / m.sum(axis=1, keepdims=True)
Безопасное сравнение floatnp.isclose(0.1 + 0.2, 0.3) # True, np.allclose(x, y)
Тригонометрия и pinp.sin(np.pi / 2) # 1.0

Агрегация по оси

axis=0 идёт вниз по строкам и даёт по одному результату на столбец. axis=1 идёт поперёк столбцов и даёт по одному результату на строку.

ЗадачаКод
Сумма всех элементовm.sum() # 21
Результат по каждому столбцуm.sum(axis=0) # [5 7 9]
Результат по каждой строкеm.sum(axis=1) # [ 6 15]
Среднее и стандартное отклонениеm.mean(), m.std(), m.mean(axis=0)
Минимум, максимумm.min(), m.max(axis=1)
Позиция максимумаm.argmax(), m.argmax(axis=1)
Медиана и перцентилиnp.median(m), np.percentile(m, [25, 50, 75])
Нарастающая суммаnp.cumsum(m, axis=1)
Произведение всех элементовm.prod() # 720
Хотя бы один, все, сколько(m > 4).any(), (m > 0).all(), np.count_nonzero(m > 2)

Изменение формы и объединение

Reshape сохраняет элементы и меняет форму, поэтому общий размер должен остаться прежним.

ЗадачаКод
Новая формаa.reshape(2, 3)
Один размер NumPy вычислит самa.reshape(3, -1), a.reshape(-1, 1)
Вытянуть в 1Dm.ravel(), m.flatten()
Транспонироватьm.T
Добавить измерениеa[:, np.newaxis], np.expand_dims(a, axis=0)
Убрать измерения размера 1np.squeeze(np.ones((1, 3, 1)))
Склеить по существующей осиnp.concatenate([a, a])
Сложить строки или столбцыnp.vstack([m, m]), np.hstack([m, m])
1D-массивы как столбцыnp.column_stack([a, a ** 2])
Сложить по новой осиnp.stack([a, a], axis=0) # shape (2, 6)
Разбить на частиnp.split(a, 3), np.array_split(a, 4)
Повторить или замоститьnp.repeat([1, 2], 2) # [1 1 2 2], np.tile([1, 2], 2) # [1 2 1 2]

Сортировка, поиск и уникальные значения

ЗадачаКод
Отсортированная копияnp.sort(a)
По убываниюnp.sort(a)[::-1]
Индексы для сортировкиnp.argsort(a)
Три наибольших значенияnp.sort(a)[-3:]
Уникальные значения и их числоvalues, counts = np.unique(a, return_counts=True)
Имена в NumPy 2 (unique_values может быть не отсортирован)np.unique_values(a), np.unique_counts(a)
Есть ли элемент в списке?np.isin(a, [1, 9])
Позиция вставки в отсортированный массивnp.searchsorted([1, 3, 5, 7], 4) # 2
Операции над множествамиnp.intersect1d(a, [1, 2, 10]), np.union1d(a, [10]), np.setdiff1d(a, [1])
Сортировка строк по столбцуm[m[:, 1].argsort()]

Случайные числа

Создай один Generator с seed и бери все числа из него, тогда результаты будут повторяться от запуска к запуску.

ЗадачаКод
Генератор с seedrng = np.random.default_rng(42)
Float в [0, 1)rng.random(3)
Целые числа, без верхней границыrng.integers(1, 7, size=10)
Нормальное распределениеrng.normal(loc=0, scale=1, size=(2, 3))
Равномерные float в диапазонеrng.uniform(5, 10, size=4)
Выбор из спискаrng.choice(["a", "b", "c"], size=5)
Выбор без повторовrng.choice(10, size=3, replace=False)
Выбор с весамиrng.choice(["H", "T"], size=10, p=[0.7, 0.3])
Перемешанная копия, перемешать на местеrng.permutation(a), rng.shuffle(a)
Биномиальные и пуассоновские величиныrng.binomial(10, 0.5, size=5), rng.poisson(3, size=5)

Линейная алгебра

ЗадачаКод
Матричное произведениеA @ A
Решить Ax = bnp.linalg.solve(A, b) # [0.8 1.4]
Обратная матрица и определительnp.linalg.inv(A), np.linalg.det(A)
Длина вектораnp.linalg.norm(b)
Собственные значения и векторыvalues, vectors = np.linalg.eig(A)
Подогнать прямуюslope, intercept = np.polyfit(x, y, 1)
Внешнее произведениеnp.outer([1, 2], [3, 4])
Диагональ и следnp.diag(A), np.trace(A)

Пропуски и особые значения

np.nan обозначает пропущенное значение float. Любая арифметика с ним даёт nan, поэтому используй функции с nan в названии или маску.

ЗадачаКод
Пропущенное значениеnp.nan
Найти пропускиnp.isnan(v), np.isnan(v).sum()
Убрать пропускиv[~np.isnan(v)]
Заменить пропуски и бесконечностиnp.nan_to_num(v, nan=0.0, posinf=0.0)
Проверки на бесконечность и конечностьnp.inf, np.isfinite(v)
Статистики без учёта NaNnp.nanmean(v[:3]) # 2.0, np.nanmax(v)

Сохранение и загрузка

ЗадачаКод
Один массив, бинарный файлnp.save("data.npy", m), m = np.load("data.npy")
Несколько массивов в одном файлеnp.savez("data.npz", x=x, y=y), np.load("data.npz")["x"]
Записать CSVnp.savetxt("data.csv", m, delimiter=",", fmt="%d")
Прочитать CSVnp.loadtxt("data.csv", delimiter=",")

NumPy 2: старые имена и что писать теперь

В NumPy 2 удалили многие псевдонимы, поэтому код из старых туториалов может падать с AttributeError.

ЗадачаNumPy 2Старая форма
Пропущенное значениеnp.nannp.NaN
Бесконечностьnp.infnp.Inf
64-битный тип floatnp.float64np.float_
Площадь под кривойnp.trapezoid(y, x)np.trapz(y, x)
Есть ли элемент в другом массиве?np.isin(a, b)np.in1d(a, b)
Сложить строкиnp.vstack([a, a])np.row_stack([a, a])
Произведениеnp.prod(a)np.product(a)
Случайные числаrng = np.random.default_rng(0) rng.random(3)np.random.seed(0) np.random.rand(3)

Вызовы NumPy, на которых держится код для анализа данных, разбитые по задачам: создать массивы, изучить их, индексировать и делать срезы, считать поэлементно, агрегировать по оси, менять форму и объединять, сортировать и искать, генерировать случайные числа и решать задачи линейной алгебры. В каждой строке короткий фрагмент кода, который можно сразу вставить, и одна строчка о том, что он делает.

Всё здесь написано для NumPy 2, той версии, что работает на Coddy, а в последней таблице собраны имена, удалённые в NumPy 2, рядом с тем, что писать вместо них. В большинстве примеров используются a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) и m = np.arange(12).reshape(3, 4). Только начинаешь с Python? Загляни в шпаргалку по Python и песочницу Python, а рядом с этой шпаргалкой держи шпаргалки по pandas, Matplotlib и scikit-learn.

Частые вопросы о шпаргалке по NumPy

Эта шпаргалка по NumPy бесплатная?
Да. Эта шпаргалка по NumPy полностью бесплатна, регистрация не нужна. Добавь её в закладки или сохрани в PDF через печать в браузере и возвращайся, когда нужно вспомнить точный вызов для reshape, суммы по оси или случайной выборки.
Какую версию NumPy охватывает шпаргалка?
NumPy 2. Все примеры работают в NumPy 2.4, той версии, что запущена на Coddy. В NumPy 2 удалили псевдонимы вроде np.NaN, np.float_, np.trapz и np.in1d, поэтому в последней таблице каждый из них показан рядом с актуальным именем.
Что значит axis=0 в NumPy?
Ось это измерение, которое схлопывается. В 2D-массиве axis=0 идёт вниз по строкам, поэтому m.sum(axis=0) возвращает по одной сумме на столбец. axis=1 идёт поперёк столбцов и возвращает по одной сумме на строку. Без оси функция берёт все элементы.
Чем представление (view) отличается от копии?
Срез вроде a[1:3] это представление: он делит память с a, поэтому изменение среза меняет a. Булевы маски и списки индексов, например a[a > 2] или a[[0, 2]], возвращают копии. Вызывай .copy(), когда нужен независимый массив.
Зачем массив NumPy, если есть список Python?
Массивы хранят значения одного типа в одном блоке памяти, поэтому вычисления над целым массивом идут в скомпилированном коде и часто во много раз быстрее цикла на Python. a * 2 удваивает каждый элемент, а [1, 2] * 2 повторяет список. pandas и scikit-learn построены на массивах NumPy.
Что использовать: np.random.seed или default_rng?
Используй rng = np.random.default_rng(seed) и вызывай методы rng, например rng.normal() или rng.integers(). Это рекомендуемый API: у него лучше генераторы случайных последовательностей и нет скрытого глобального состояния. np.random.seed и np.random.rand по-прежнему работают, но это устаревший интерфейс.
Можно ли запускать код NumPy онлайн?
Да. Бесплатная песочница Matplotlib запускает Python с NumPy, pandas, Matplotlib и scikit-learn прямо в браузере, так что любой фрагмент из этой шпаргалки можно вставить и запустить без установки. Курс Coddy по машинному обучению учит NumPy шаг за шагом, на работе с реальными данными.
Иллюстрация языков программирования Coddy

Изучайте NumPy с Coddy

НАЧАТЬ