Broadcasting (распространение) в NumPy

Broadcasting (распространение) в NumPy NumPy

Привет! Broadcasting — это одна из самых мощных и удобных фишек NumPy. Она позволяет выполнять операции над массивами разных форм без явного копирования данных. Это делает код короче и быстрее.

В этой статье мы разберём:

  • Что такое broadcasting
  • Правила broadcasting
  • Примеры с векторами и матрицами
  • Практическое применение
  • Частые ошибки

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный NumPy
  • Базовое понимание массивов и их форм

Совет: Broadcasting автоматически «растягивает» меньший массив до размера большего.

Основная часть

Что такое broadcasting

Broadcasting — это механизм, который позволяет выполнять операции с массивами разных форм без явного копирования данных.

import numpy as np

# Скаляр + массив (самый простой случай)
arr = np.array([1, 2, 3])
print(arr + 5)   # [6 7 8]

# Вектор + матрица
matrix = np.array([[1, 2, 3], [4, 5, 6]])
vector = np.array([10, 20, 30])
print(matrix + vector)
# [[11 22 33]
#  [14 25 36]]

Совет: Broadcasting не создаёт копии больших массивов, что экономит память.

Правила broadcasting

NumPy сравнивает формы массивов с конца:

  1. Если размерности совпадают — OK
  2. Если одна из размерностей равна 1 — она «растягивается»
  3. Если размерности не совпадают и ни одна не равна 1 — ошибка
# Форма (3, 4) и (4,) → OK (4 совпадает с 4)
arr1 = np.ones((3, 4))
arr2 = np.array([1, 2, 3, 4])
result = arr1 + arr2   # OK

# Форма (3, 4) и (3,) → Ошибка (4 ≠ 3)
# arr1 + np.array([1, 2, 3])   # ValueError

# Форма (3, 4) и (3, 1) → OK (1 растягивается до 4)
arr3 = np.array([[1], [2], [3]])
result = arr1 + arr3   # OK

Совет: Broadcasting работает справа налево (с последнего измерения).

Broadcasting со скалярами

Самый простой случай — скаляр «растягивается» до формы массива.

arr = np.array([[1, 2, 3], [4, 5, 6]])
result = arr * 2
print(result)
# [[ 2  4  6]
#  [ 8 10 12]]

Broadcasting вектора на матрицу

matrix = np.array([[1, 2, 3], [4, 5, 6]])
vector = np.array([10, 20, 30])

# Вектор растягивается до формы (2, 3)
print(matrix + vector)
# [[11 22 33]
#  [14 25 36]]

# Вектор-столбец
vector_col = np.array([[10], [20]])
print(matrix + vector_col)
# [[11 12 13]
#  [24 25 26]]

Broadcasting матриц разных форм

# Форма (3, 1) и (1, 4) → результат (3, 4)
a = np.array([[1], [2], [3]])   # (3, 1)
b = np.array([[10, 20, 30, 40]]) # (1, 4)
print(a + b)
# [[11 21 31 41]
#  [12 22 32 42]
#  [13 23 33 43]]

Совет: Это создаёт таблицу сложения всех комбинаций.

Практические примеры

Пример 1. Центрирование данных:

data = np.array([[10, 20, 30],
                 [40, 50, 60],
                 [70, 80, 90]])

# Вычитаем среднее по столбцам
col_mean = np.mean(data, axis=0)
centered = data - col_mean
print(centered)
# [[-30 -30 -30]
#  [  0   0   0]
#  [ 30  30  30]]

Пример 2. Нормализация данных:

data = np.array([[10, 20, 30],
                 [40, 50, 60],
                 [70, 80, 90]])

# Вычитаем среднее и делим на std
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)
normalized = (data - mean) / std
print(normalized)
# [[-1.22474487 -1.22474487 -1.22474487]
#  [ 0.          0.          0.        ]
#  [ 1.22474487  1.22474487  1.22474487]]

Пример 3. Применение маски к каждому столбцу:

data = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]])

mask = np.array([True, False, True])
# Применяем маску ко всем строкам
print(data[:, mask])
# [[1 3]
#  [4 6]
#  [7 9]]

Полный пример

import numpy as np

# Матрица 3x4
A = np.arange(12).reshape(3, 4)
print("A (3x4):\n", A)

# Вектор (4,)
v = np.array([10, 20, 30, 40])
print("v (4,):", v)

# Broadcasting: матрица + вектор
print("\nA + v:\n", A + v)

# Вектор-столбец (3, 1)
c = np.array([[1], [2], [3]])
print("\nc (3,1):\n", c)

# Broadcasting: матрица + вектор-столбец
print("\nA + c:\n", A + c)

# Матрица 1x4
row = np.array([[100, 200, 300, 400]])
print("\nrow (1x4):\n", row)

# Broadcasting: A + row
print("\nA + row:\n", A + row)

# Вектор (4,) и вектор (3, 1) → ошибка
# v + c   # ValueError

# Скаляр + матрица
print("\nA * 2:\n", A * 2)

Результат:

A (3x4):
 [[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]
v (4,): [10 20 30 40]

A + v:
 [[10 21 32 43]
  [14 25 36 47]
  [18 29 40 51]]

c (3,1):
 [[1]
  [2]
  [3]]

A + c:
 [[ 1  2  3  4]
  [ 6  7  8  9]
  [11 12 13 14]]

row (1x4):
 [[100 200 300 400]]

A + row:
 [[100 201 302 403]
  [104 205 306 407]
  [108 209 310 411]]

A * 2:
 [[ 0  2  4  6]
  [ 8 10 12 14]
  [16 18 20 22]]

Задачи для закрепления

Задача 1. Прибавь скаляр 5 к матрице 3×3.

Задача 2. Прибавь вектор (3,) к матрице 3×3.

Задача 3. Прибавь вектор-столбец (3, 1) к матрице 3×3.

Задача 4. Вычисли среднее по столбцам и вычти его из матрицы.

Задача 5. Что произойдёт при попытке сложить матрицу (3, 4) и вектор (2,)?

Ответы:

Задача 1.

matrix = np.ones((3, 3))
result = matrix + 5

Задача 2.

matrix = np.ones((3, 3))
vector = np.array([1, 2, 3])
result = matrix + vector

Задача 3.

matrix = np.ones((3, 3))
vector_col = np.array([[1], [2], [3]])
result = matrix + vector_col

Задача 4.

data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mean = np.mean(data, axis=0)
result = data - mean

Задача 5.

# ValueError: operands could not be broadcast together with shapes (3,4) (2,)

Нюансы и подводные камни

Broadcasting начинается с конца

Формы сравниваются с последнего измерения.

Размерность 1 — особенная

Любая размерность, равная 1, может «растягиваться».

Ошибка при несовместимых формах

Если размерности не совпадают и ни одна не равна 1 — ошибка.

Частые ошибки и как их избежать

Ошибка 1: Неправильная форма вектора

Проверяй shape массива перед операцией.

Ошибка 2: Путаница между строкой и столбцом

Используй reshape(-1, 1) для создания вектор-столбца.

Ошибка 3: Ожидание broadcasting без проверки

Всегда проверяй формы с помощью .shape.

Шпаргалка

ОперацияФорма AФорма BРезультат
A + скаляр(3, 4)()(3, 4)
A + вектор(3, 4)(4,)(3, 4)
A + вектор-столбец(3, 4)(3, 1)(3, 4)
A + B(3, 1)(1, 4)(3, 4)

Заключение

Сегодня мы:

  • Узнали, что такое broadcasting
  • Изучили правила broadcasting
  • Разобрали примеры с векторами и матрицами
  • Практические примеры

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×