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

/notes/numpy/images/feature.png

Конспект посвящён модулю NumPy и основам его применения.

Введение

Вечно актуальная документация: https://numpy.org/doc/stable/index.html

numpy — библиотека Python, которая предоставляет инструменты для мощных и универсальных вычислений с многомерными массивами, математическими функциями и другими инструментами. Чаще всего применяется в анализе и машинном обучении.

Операции с массивами NumPy выполняются быстрее и эффективнее, чем со стандартными Python lists, поскольку все элементы в них имеют одинаковый тип, а сами данные хранятся единым блоком.

Обычно библиотеку импортируют так: import numpy as np


ndarray

ndarray — основной тип данных в NumPy. Он представляет собой многомерный однородный массив и обладает следующими характеристиками:

  • Многомерный. С помощью библиотеки можно создавать вектора, матрицы, трёхмерные массивы и т.д.
  • Однородные типы. Все элементы ndarray принадлежат одному и тому же типу данных.
  • Индексируемый. К ndarray можно обращаться по индексу. Также поддерживаются многомерные срезы.

Атрибуты

attributepurpose
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, но поддерживаются другими библиотеками.

Пример:

1
2
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
1
2
3
Вывод:
[[1 2 3]
 [4 5 6]]
Инфо
Описание очевидных (субъективно) и уже разобранных параметров функций будут опускаться

np.arange()

Функция np.arange([start, ]stop, [step, ]dtype=None, *, device=None, like=None) схожа с range() в Python, но возвращает не итерируемый объект, а массив.

Инфо
Квадратные скобки в описании функции указывают на необязательные параметры

Параметры:

  • device: Устройство, на котором будет создан массив. Добавлен для совместимости с Array API.

Пример:

1
2
3
print(np.arange(0, 50, 10))

# Вывод: [ 0 10 20 30 40]

np.zeros()

Функция np.zeros(shape, dtype=float, order='C', *, like=None) возвращает массив указанной формы и заполняет его нулями.

Параметры:

  • shape: Форма массива. Задаётся последовательностью из целых чисел.

Пример:

1
print(np.zeros((2, 3)))
1
2
3
Вывод:
[[0. 0. 0.]
 [0. 0. 0.]]

np.ones()

Функция np.ones(shape, dtype=None, order='C', *, device=None, like=None) возвращает массив указанной формы и заполняет его единицами.

Пример:

1
2
3
print(np.ones(5))

# Вывод: [1. 1. 1. 1. 1.]

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: Размер квадратной матрицы.

Пример:

1
print(np.identity(3))
1
2
3
4
Вывод:
[[1.  0.  0.]
 [0.  1.  0.]
 [0.  0.  1.]]

np.eye()

Функция np.eye(N, M=None, k=0, dtype=<class 'float'>, order='C', *, device=None, like=None) возвращает матрицу с единицами на главной диагонали и нулями в остальных местах.

Параметры:

  • N: Размер квадратной матрицы. Если M не None — количество столбцов.
  • M: Количество столбцов.
  • k: Положение диагонали.

Пример:

1
print(np.eye(3, k=1))
1
2
3
4
Вывод:
[[0.  1.  0.]
 [0.  0.  1.]
 [0.  0.  0.]]

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: Ось, в которой размещаются значения (точки).

Пример:

1
2
3
print(np.linspace(2.0, 3.0, num=5))

# Вывод: [2.   2.25 2.5  2.75 3.  ]

np.tile()

Функция np.tile(A, reps) возвращает массив, созданный путём повторения переданного массива указанное количество раз вдоль определённых осей.

Параметры:

  • A: Исходный массив.
  • reps: Количество повторений. Может быть как числом (повторяет вдоль одной оси), так и кортежем.

Пример 1:

1
2
3
4
c = np.array([1,2,3,4])
print(np.tile(c, 2))

# Вывод: [1 2 3 4 1 2 3 4]

Пример 2:

1
2
c = np.array([1,2,3,4])
print(np.tile(c, (4, 1)))
1
2
3
4
5
Вывод:
[[1 2 3 4]
 [1 2 3 4]
 [1 2 3 4]
 [1 2 3 4]]

Методы ndarray

  1. Метод ndarray.astype(dtype, order='K', casting='unsafe', subok=True, copy=True) изменяет тип данных элементов массива на dtype.

  2. 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]]
  3. 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]]
  4. 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]]
  5. ndarray.swapaxes(axis1, axis2) меняет оси массива местами.


Операции над массивами

Арифметические операции

В NumPy арифметические операции между массивами выполняются поэлементно.

operationdescription
+Сложение массивов или массива с числом
-1. Унарный минус. 2. Разность массивов или массива с числом
*Умножение массивов или массива с числом
**Возведение в степень (указывается число или массив)
/Деление массивов или массива с числом
//Целочисленное деление массивов или массива с числом
%Вычисление остатка от деления (указывается или число или массив)
@Вычисление матричного произведения

Унарные функции

functionpurpose
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

Бинарные функции

Инфо
Большинство функций этого раздела требуют, что входные массивы были одинаковой формы
functionpurpose
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)Возвращает булев массив, отражающий присутствие элементов первого массива во втором

Сравнение

functionpurpose
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

Логические операции

functionpurpose
np.logical_and(x1, x2)Возвращает булев массив, полученный поэлементной логической операцией AND между двумя массивами
np.logical_or(x1, x2)Возвращает булев массив, полученный поэлементной логической операцией OR между двумя массивами
np.logical_xor(x1, x2)Возвращает булев массив, полученный поэлементной логической операцией XOR между двумя массивами

Математические и статистические операции

functionpurpose
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)Возвращает массив: частоты встречаемости каждого числа

Другие операции

  1. 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]]
  2. np.sort(a, axis=-1, kind=None, order=None, *, stable=None): Возвращает отсортированный массив.

    Параметры:

    • kind: Алгоритм сортировки. ‘quicksort’, ‘mergesort’, ‘heapsort’, ‘stable’.
    • order: Применяется для сортировки структурированных массивов.
  3. 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]
  4. 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]
  5. np.union1d(ar1, ar2): Возвращает отсортированный массив уникальных элементов, объединенных из двух входных массивов.

    Пример:

    1
    2
    3
    
    print(np.union1d([-1, 0, 1], [-2, 0, 2]))
    
    # Вывод: [-2 -1  0  1  2]
  6. np.setdiff1d(ar1, ar2, assume_unique=False): Возвращает уникальные элементы, которые есть в ar1, но отсутствуют в ar2.

  7. np.setxor1d(ar1, ar2, assume_unique=False): Возвращает уникальные элементы, которые есть в одном из массивов, но отсутствуют в обоих.

  8. 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]]

Срезы

  1. Срезы в векторах аналогичны обычным срезам в Python.

  2. Срезы в матрицах происходят по каждому измерению.

    Пример:

     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 для каждого измерения матрицы

    /notes/numpy/images/slices1.png

  3. Срезы в многомерных массивах происходят аналогично срезам в двумерных, с использованием индексов для каждого измерения.


Булева индексация

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

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

1
2
3
4
5
arr = np.array([1, 2, 3, 4, 5])
boolean_arr = arr > 3
print(boolean_arr)

# Вывод: [False False False  True  True]

Булев массив используется для индексации: будут возвращены элементы, индекс которых соответствует True:

1
2
3
print(arr[boolean_arr])

# Вывод: [4 5]

Условия также можно комбинировать, используя логические операторы &, | и ~ (условия обязательно брать в скобки):

1
2
3
4
boolean_arr = (arr > 3) & (arr < 5)
print(arr[boolean_arr])

# Вывод: [4]

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. Поиск индексов элементов:

    1
    2
    3
    4
    
    arr = np.array([1, 2, 3, 4, 5])
    print(np.where(arr > 3))
    
    # Вывод: (array([3, 4], dtype=int64),)
  2. Замена элементов по условию:

    1
    2
    3
    4
    
    arr = np.array([1, 2, 3, 4, 5])
    print(np.where(arr > 3, 10, arr))
    
    # Вывод: [ 1  2  3 10 10]
  3. Применение нескольких условий:

    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, предназначенный для работы с генерацией псевдослучайных чисел. Он предоставляет функции для создания массивов со случайными значениями, а также для работы с распределениями вероятностей.

  1. 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), где первое число указывает на количество “слоёв”, второе — на количество строк в каждом слое, и третье — на количество столбцов. Итого имеем три измерения в данном массиве
  2. np.random.randn(d0, d1, ..., dn) возвращает массив из распределённых нормальным образом (Гауссово распределение) случайных чисел.

  3. np.random.randint(low, high=None, size=None, dtype=int) возвращает массив случайных целых чисел в указанном диапазоне.

    Параметры:

    • low: Нижняя граница диапазона.
    • high: Верхняя граница диапазона.
    • size: Форма массива. Аналогично shape.
  4. np.random.choice(a, size=None, replace=True, p=None) возвращает случайный элемент из вектора.

  5. 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]
  6. np.random.shuffle(x) выполняет случайную перестановку элементов в исходном массиве, возвращая None.

Поддержать автора
NoisyCake cloudtipscloudtips
0%