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

Конспект посвящён модулю NumPy и основам его применения.
Введение
Вечно актуальная документация: https://numpy.org/doc/stable/index.html
numpy — библиотека Python, которая предоставляет инструменты для мощных и универсальных вычислений с многомерными массивами, математическими функциями и другими инструментами. Чаще всего применяется в анализе и машинном обучении.
Операции с массивами NumPy выполняются быстрее и эффективнее, чем со стандартными Python lists, поскольку все элементы в них имеют одинаковый тип, а сами данные хранятся единым блоком.
Обычно библиотеку импортируют так:
import numpy as np
ndarray
ndarray — основной тип данных в NumPy. Он представляет собой многомерный однородный массив и обладает следующими характеристиками:
- Многомерный. С помощью библиотеки можно создавать вектора, матрицы, трёхмерные массивы и т.д.
- Однородные типы. Все элементы
ndarrayпринадлежат одному и тому же типу данных. - Индексируемый. К
ndarrayможно обращаться по индексу. Также поддерживаются многомерные срезы.
Атрибуты
| attribute | purpose |
|---|---|
shape |
Содержит форму массива в виде кортежа, где каждое число указывает на количество элементов в соответствующем измерении. Например, для объекта array([[1, 2, 3, 4], [1, 2, 3, 4]]) shape будет (2, 4) |
dtype |
Тип данных элементов массива |
size |
Общее количество элементов в массиве |
ndim |
Количество измерений массива |
Создание массива
ndarray создаётся различными функциями, например array(), arange(), zeros(), ones() и т.д.
np.array()
Функция np.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0, like=None) возвращает массив из объекта, такого как список или кортеж.
Параметры:
object: Исходный объект, являющийся коллекцией Python (списки, кортежи, множества, генераторы и т.п.).dtype: Тип данных элементов массива. Если не указан, тип данных будет определен автоматически.copy: Если True, создаёт копию массива.order: Порядок, в котором будут расположены элементы массива в памяти (‘C’ - C-порядок, ‘F’ - порядок Fortran).subok: Если True, подклассы будут переданы, если это возможно.ndmin: Минимальное количество измерений в массиве.like: Объект, который используется для создания массива, совместимого с другим типом данных. Если переданный объект поддерживает протокол__array_function__, результат будет совместим с этим объектом. Это позволяет создавать массивы, которые не являются массивами NumPy, но поддерживаются другими библиотеками.
Пример:
|
|
|
|
np.arange()
Функция np.arange([start, ]stop, [step, ]dtype=None, *, device=None, like=None) схожа с range() в Python, но возвращает не итерируемый объект, а массив.
Параметры:
device: Устройство, на котором будет создан массив. Добавлен для совместимости с Array API.
Пример:
|
|
np.zeros()
Функция np.zeros(shape, dtype=float, order='C', *, like=None) возвращает массив указанной формы и заполняет его нулями.
Параметры:
shape: Форма массива. Задаётся последовательностью из целых чисел.
Пример:
|
|
|
|
np.ones()
Функция np.ones(shape, dtype=None, order='C', *, device=None, like=None) возвращает массив указанной формы и заполняет его единицами.
Пример:
|
|
np.empty()
Функция np.empty(shape, dtype=float, order='C', *, device=None, like=None) возвращает массив указанной формы, не заполняя его значениями. Элементы будут содержать “мусор” из выделенной памяти.
np.full()
Функция np.full(shape, fill_value, dtype=None, order='C', *, device=None, like=None) возвращает массив указанной формы и заполняет его fill_value.
np.identity()
Функция np.identity(n, dtype=None, *, like=None) возвращает квадратную матрицу с единицами на главной диагонали и нулями в остальных местах.
Параметры:
n: Размер квадратной матрицы.
Пример:
|
|
|
|
np.eye()
Функция np.eye(N, M=None, k=0, dtype=<class 'float'>, order='C', *, device=None, like=None) возвращает матрицу с единицами на главной диагонали и нулями в остальных местах.
Параметры:
N: Размер квадратной матрицы. ЕслиMне None — количество столбцов.M: Количество столбцов.k: Положение диагонали.
Пример:
|
|
|
|
np.linspace()
Функция np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0, *, device=None) возвращает массив из num равномерно распределённых точек в указанном интервале.
Параметры:
start: Начало интервала.stop: Конец интервала.num: Количество элементов.endpoint: Если True,stopвключается в интервал.retstep: Если True, возвращает кортеж(samples, step)(samples — итоговый массив).axis: Ось, в которой размещаются значения (точки).
Пример:
|
|
np.tile()
Функция np.tile(A, reps) возвращает массив, созданный путём повторения переданного массива указанное количество раз вдоль определённых осей.
Параметры:
A: Исходный массив.reps: Количество повторений. Может быть как числом (повторяет вдоль одной оси), так и кортежем.
Пример 1:
|
|
Пример 2:
|
|
|
|
Методы ndarray
-
Метод
ndarray.astype(dtype, order='K', casting='unsafe', subok=True, copy=True)изменяет тип данных элементов массива наdtype. -
ndarray.Tтранспонирует массив, меняя местами элементы разных осей.Примеры:
1 2 3 4arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr) print() print(arr.T)1 2 3 4 5 6 7Вывод: [[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] -
ndarray.transpose(*axes)транспонирует массив, позволяя указать порядок осей.Пример:
1 2arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr.transpose(1, 0))1 2 3 4Вывод: [[1 4] [2 5] [3 6]] -
ndarray.reshape(shape, /, *, order='C', copy=None)изменяет форму массива наshape.Пример:
1 2 3 4arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr) print(arr.reshape((1, 9)))1 2 3 4 5Вывод: [[1 2 3] [4 5 6] [7 8 9]] [[1 2 3 4 5 6 7 8 9]] -
ndarray.swapaxes(axis1, axis2)меняет оси массива местами.
Операции над массивами
Арифметические операции
В NumPy арифметические операции между массивами выполняются поэлементно.
| operation | description |
|---|---|
+ |
Сложение массивов или массива с числом |
- |
1. Унарный минус. 2. Разность массивов или массива с числом |
* |
Умножение массивов или массива с числом |
** |
Возведение в степень (указывается число или массив) |
/ |
Деление массивов или массива с числом |
// |
Целочисленное деление массивов или массива с числом |
% |
Вычисление остатка от деления (указывается или число или массив) |
@ |
Вычисление матричного произведения |
Унарные функции
| function | purpose |
|---|---|
np.absolute(x) (np.abs(x)) и np.fabs(x) |
Вычисляют модули элементов массива. Последняя обычно используется для чисел с плавающей точкой |
np.sqrt(x) |
Вычисляет квадратные корни элементов массива |
np.square(x) |
Возводит элементы массива в квадрат |
np.exp(x) |
Вычисляет экспоненту для каждого элемента массива |
np.log(x), np.log10(x), np.log2(x) и np.log1p(x) |
Вычисляют натуральный, десятичный, двоичный логарифмы и log(1+x) соответственно |
np.sign(x) |
Возвращает массив знаков элементов исходного массива |
np.ceil(x) |
Округляет элементы массива в большую сторону |
np.floor(x) |
Округляет элементы массива в меньшую сторону |
np.rint(x) |
Округляет элементы массива до ближайшего целого числа, сохраняя тип данных |
np.modf(x) |
Возвращает кортеж двух массивов, в первом из которых дробная часть числа, во втором — целая |
np.isnan(x) |
Возвращает булев массив, отражающий элементы, равные NaN |
np.isfinite(x) |
Возвращает булев массив, отражающий конечные элементы |
np.isinf(x) |
Возвращает булев массив, отражающий бесконечные элементы |
np.logical_not(x) |
Возвращает булев массив, полученный поэлементной логической операцией NOT |
Бинарные функции
| function | purpose |
|---|---|
np.add(x1, x2) |
Поэлементно складывает два массива |
np.subtract(x1, x2) |
Поэлементно вычитает второй массив из первого |
np.multiply(x1, x2) |
Поэлементно умножает два массива |
np.divide(x1, x2) |
Поэлементно делит первый массив на второй |
np.floor_divide(x1, x2) |
Поэлементно делит первый массив на второй, округляя результат в меньшую сторону до целого числа |
np.power(x1, x2) |
Поэлементно возводит первый массив в степень второго |
np.maximum(x1, x2) |
Поэлементно вычисляет максимум двух массивов |
np.fmax(x1, x2) |
Поэлементно вычисляет максимум двух массивов. Если один из элементов NaN, в качестве максимума выбирается второй. Если оба NaN — выбирается первый |
np.minimum(x1, x2) |
Поэлементно вычисляет минимум двух массивов |
np.fmin(x1, x2) |
Аналогичен np.fmax(), но выбирает минимум |
np.mod(x1, x2) |
Поэлементно вычисляет остаток от деления первого массива на второй |
np.copysign(x1, x2) |
Поэлементно копирует знак из второго массива в значение первого |
np.isin(x1, x2) |
Возвращает булев массив, отражающий присутствие элементов первого массива во втором |
Сравнение
| function | purpose |
|---|---|
np.greater(x1, x2) |
Возвращает булев массив, где элемент True, если соответствующий элемент x1 > x2 |
np.greater_equal(x1, x2) |
Возвращает булев массив, где элемент True, если соответствующий элемент x1 >= x2 |
np.less(x1, x2) |
Возвращает булев массив, где элемент True, если соответствующий элемент x1 < x2 |
np.less_equal(x1, x2) |
Возвращает булев массив, где элемент True, если соответствующий элемент x1 <= x2 |
np.equal(x1, x2) |
Возвращает булев массив, где элемент True, если соответствующий элемент x1 == x2 |
np.not_equal(x1, x2) |
Возвращает булев массив, где элемент True, если соответствующий элемент x1 != x2 |
Логические операции
| function | purpose |
|---|---|
np.logical_and(x1, x2) |
Возвращает булев массив, полученный поэлементной логической операцией AND между двумя массивами |
np.logical_or(x1, x2) |
Возвращает булев массив, полученный поэлементной логической операцией OR между двумя массивами |
np.logical_xor(x1, x2) |
Возвращает булев массив, полученный поэлементной логической операцией XOR между двумя массивами |
Математические и статистические операции
| function | purpose |
|---|---|
np.sum(x) |
Возвращает сумму элементов массива |
np.mean(x) |
Возвращает среднее значение элементов массива |
np.median(x) |
Возвращает медиану значений массива |
np.std(x) |
Возвращает стандартное (среднеквадратичное) отклонение элементов массива |
np.var(x) |
Возвращает дисперсию элементов массива |
np.min(x) |
Возвращает минимальное значение в массиве |
np.max(x) |
Возвращает максимальное значение в массиве |
np.argmin(x) |
Возвращает индекс минимального значения в массиве |
np.argmax(x) |
Возвращает индекс максимального значения в массиве |
np.cumsum(x) |
Возвращает массив: кумулятивную сумму элементов массива |
np.cumprod(x) |
Возвращает массив: кумулятивное произведение элементов массива |
np.ptp(x) |
Возвращает разницу между максимальным и минимальным значениями в массиве (размах) |
np.diff(x) |
Возвращает массив: разницу между соседними элементами массива |
np.bincount(x) |
Возвращает массив: частоты встречаемости каждого числа |
Другие операции
-
np.dot(a, b, out=None): Возвращает точечное произведение массивов, а конкретно:- Если оба массива — вектора, возвращает их скалярное произведение;
- Если оба массива — матрицы, возвращает их матричное произведение;
- Если оба массива — скаляры, возвращает их обычное произведение;
- Если один из массивов — вектор, а второй — многомерный, возвращает сумму произведений по последней оси многомерного массива;
- Если оба массива — многомерные, возвращает сумму произведений по последней оси первого массива и предпоследней оси второго.
Примеры:
1 2 3 4 5print(np.dot([2j, 3j], [2j, 3j])) a = [[1, 0], [0, 1]] b = [[4, 1], [2, 2]] print(np.dot(a, b))1 2 3 4Вывод: (-13+0j) [[4 1] [2 2]] -
np.sort(a, axis=-1, kind=None, order=None, *, stable=None): Возвращает отсортированный массив.Параметры:
kind: Алгоритм сортировки. ‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’.order: Применяется для сортировки структурированных массивов.
-
np.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None, *, equal_nan=True): Возвращает массивы уникальных элементов в исходном массиве (по умолчанию)Параметры:
return_index: Если True, то вдобавок возвращает массив индексов первого вхождения уникальных элементов.return_inverse: Если True, то вдобавок возвращает массив индексов уникальных элементов массива, по которым можно восстановить исходный массив.return_counts: Если True, то вдобавок возвращает массив частот вхождений каждого уникального значения в исходный массив.
Пример:
1 2 3a = np.array([1, 2, 6, 4, 2, 3, 2]) u, indices = np.unique(a, return_inverse=True) print(u, indices, sep='\n')1 2 3Вывод: [1 2 3 4 6] [0 1 4 3 1 2 1] -
np.intersect1d(ar1, ar2, assume_unique=False, return_indices=False): Возвращает отсортированный массив уникальных элементов, общих для двух входных массивов.Пример:
1 2 3print(np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])) # Вывод: [1 3] -
np.union1d(ar1, ar2): Возвращает отсортированный массив уникальных элементов, объединенных из двух входных массивов.Пример:
1 2 3print(np.union1d([-1, 0, 1], [-2, 0, 2])) # Вывод: [-2 -1 0 1 2] -
np.setdiff1d(ar1, ar2, assume_unique=False): Возвращает уникальные элементы, которые есть вar1, но отсутствуют вar2. -
np.setxor1d(ar1, ar2, assume_unique=False): Возвращает уникальные элементы, которые есть в одном из массивов, но отсутствуют в обоих. -
np.delete(arr, obj, axis=None): Удаляет элемент из массива.Пример:
1 2arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) np.delete(arr, 1, 0)1 2 3Вывод: [[ 1 2 3 4] [ 9 10 11 12]]
Срезы
-
Срезы в векторах аналогичны обычным срезам в Python.
-
Срезы в матрицах происходят по каждому измерению.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # Выбираем вторую строку print(matrix[1, :]) # Вывод: [4 5 6] # Выбираем второй столбец print(matrix[:, 1]) # Вывод: [2 5 8] # Выбираем подматрицу 2x2 в нижнем правом углу print(matrix[1:, 1:]) # Вывод: # [[5 6] # [8 9]]При слайсинге можно использовать аналогичные параметры
start:stop:stepдля каждого измерения матрицы
-
Срезы в многомерных массивах происходят аналогично срезам в двумерных, с использованием индексов для каждого измерения.
Булева индексация
Индексация по булевым значениям в NumPy — механизм выбора элементов из массива на основе булевых условий. Он позволяет создавать условные выражения для фильтрации данных.
Если булева индексация используется на многомерном массиве, отбираемые элементы автоматически сворачиваются в вектор.
Можно создать булев массив такой же формы, что и исходный массив, применяя условные операции к элементам:
|
|
Булев массив используется для индексации: будут возвращены элементы, индекс которых соответствует True:
|
|
Условия также можно комбинировать, используя логические операторы &, | и ~ (условия обязательно брать в скобки):
|
|
any() и all()
Функция np.any(a, axis=None, out=None, keepdims=<no value>, *, where=<no value>) возвращает True, если хотя бы один элемент переданного массива оценивается как True, иначе — False.
Параметры:
a: Входной массив или объект, преобразуемый в массив.axis: Проверяемые оси (в матрицах: 0 — строки, 1 — столбцы).out: Альтернативный массив для сохранения результата.keepdims: Если True, сохраняет размерность исходного массива.where: Условие, определяющее, какие элементы включать в проверку.
axis=None, возвращает одно булево значение, если указана ось, возвращает массив булевых значений.Функция np.all(a, axis=None, out=None, keepdims=<no value>, *, where=<no value>) возвращает True, если все элементы переданного массива оцениваются как True, иначе — False.
np.where()
Функция np.where(condition, [x, y, ]/) возвращает элементы из x или y в зависимости от условия (condition).
Параметры:
condition: Условие / массив условий.x: Возвращаемое значение, еслиconditionTrue.y: Возвращаемое значение, еслиconditionFalse.
Примеры использования:
-
Поиск индексов элементов:
1 2 3 4arr = np.array([1, 2, 3, 4, 5]) print(np.where(arr > 3)) # Вывод: (array([3, 4], dtype=int64),) -
Замена элементов по условию:
1 2 3 4arr = np.array([1, 2, 3, 4, 5]) print(np.where(arr > 3, 10, arr)) # Вывод: [ 1 2 3 10 10] -
Применение нескольких условий:
1 2 3 4arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) print(np.where((arr > 3) & (arr < 7), arr * 2, arr)) # Вывод: [ 1 2 3 8 10 12 7 8 9]
np.random
np.random — модуль библиотеки numpy, предназначенный для работы с генерацией псевдослучайных чисел. Он предоставляет функции для создания массивов со случайными значениями, а также для работы с распределениями вероятностей.
-
np.random.rand(d0, d1, ..., dn)возвращает массив из равномерно распределённых в диапазоне [0.0, 1.0) случайных чисел.Параметры:
d0, d1, ..., dn: Размеры массива по каждой из осей.
Пример:
1print(np.random.rand(3, 4, 2))1 2 3 4 5 6 7 8 9 10 11 12 13 14 15Вывод: [[[0.47574577 0.53369332] [0.6309306 0.76129442] [0.83415841 0.10869505] [0.42194621 0.03892143]] [[0.85396426 0.18211675] [0.56339344 0.46062141] [0.23051301 0.07067886] [0.09967516 0.89563758]] [[0.04364151 0.59463831] [0.25770927 0.91701878] [0.84273668 0.77615006] [0.67179846 0.04092679]]]ИнфоЕсли посмотреть на атрибутshapeсозданного объекта, увидим(3, 4, 2), где первое число указывает на количество “слоёв”, второе — на количество строк в каждом слое, и третье — на количество столбцов. Итого имеем три измерения в данном массиве -
np.random.randn(d0, d1, ..., dn)возвращает массив из распределённых нормальным образом (Гауссово распределение) случайных чисел. -
np.random.randint(low, high=None, size=None, dtype=int)возвращает массив случайных целых чисел в указанном диапазоне.Параметры:
low: Нижняя граница диапазона.high: Верхняя граница диапазона.size: Форма массива. Аналогичноshape.
-
np.random.choice(a, size=None, replace=True, p=None)возвращает случайный элемент из вектора. -
np.random.permutation(x)возвращает случайную перестановку последовательности. Если передан многомерный массив, то функция отработает только по первой оси.Пример:
1 2 3 4arr = np.array([1, 2, 3, 4, 5]) print(np.random.permutation(arr)) # Вывод: [3 5 2 4 1] -
np.random.shuffle(x)выполняет случайную перестановку элементов в исходном массиве, возвращая None.
cloudtips