Привет! Broadcasting — это одна из самых мощных и удобных фишек NumPy. Она позволяет выполнять операции над массивами разных форм без явного копирования данных. Это делает код короче и быстрее.
В этой статье мы разберём:
- Что такое broadcasting
- Правила broadcasting
- Примеры с векторами и матрицами
- Практическое применение
- Частые ошибки
- Что нужно знать перед началом
- Основная часть
- Что такое broadcasting
- Правила broadcasting
- Broadcasting со скалярами
- Broadcasting вектора на матрицу
- Broadcasting матриц разных форм
- Практические примеры
- Полный пример
- Задачи для закрепления
- Нюансы и подводные камни
- Broadcasting начинается с конца
- Размерность 1 — особенная
- Ошибка при несовместимых формах
- Частые ошибки и как их избежать
- Ошибка 1: Неправильная форма вектора
- Ошибка 2: Путаница между строкой и столбцом
- Ошибка 3: Ожидание 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 сравнивает формы массивов с конца:
- Если размерности совпадают — OK
- Если одна из размерностей равна 1 — она «растягивается»
- Если размерности не совпадают и ни одна не равна 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
- Разобрали примеры с векторами и матрицами
- Практические примеры





