Шпаргалка по 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 4
arr = 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 2
arr = 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 4
arr = 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 5
print(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 3
a = 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 3
print(np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])) # Вывод: [1 3]
np.union1d(ar1, ar2)
: Возвращает отсортированный массив уникальных элементов, объединенных из двух входных массивов.Пример:
1 2 3
print(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 2
arr = 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 17
matrix = 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
: Возвращаемое значение, еслиcondition
True.y
: Возвращаемое значение, еслиcondition
False.
Примеры использования:
Поиск индексов элементов:
1 2 3 4
arr = np.array([1, 2, 3, 4, 5]) print(np.where(arr > 3)) # Вывод: (array([3, 4], dtype=int64),)
Замена элементов по условию:
1 2 3 4
arr = np.array([1, 2, 3, 4, 5]) print(np.where(arr > 3, 10, arr)) # Вывод: [ 1 2 3 10 10]
Применение нескольких условий:
1 2 3 4
arr = 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
: Размеры массива по каждой из осей.
Пример:
1
print(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 4
arr = np.array([1, 2, 3, 4, 5]) print(np.random.permutation(arr)) # Вывод: [3 5 2 4 1]
np.random.shuffle(x)
выполняет случайную перестановку элементов в исходном массиве, возвращая None.
