Broadcasting: правила совместимости форм и исправление несовместимости
Содержание курса
Диагностика ошибки несовместимости форм
Когда два массива не проходят проверку совместимости, NumPy бросает ValueError с сообщением вида:
ValueError: operands could not be broadcast together with shapes (3,) (3, 4)
В тексте ошибки всегда написаны обе формы — именно с ними и нужно работать.
Диагностика делается в три шага.
Шаг 1. Выписать оба shape из сообщения об ошибке (или проверить через .shape в коде).
Шаг 2. Выровнять формы справа: к более короткой добавить единицы слева до совпадения числа осей.
Шаг 3. Пройтись по осям слева направо и найти ту, где размеры не равны и ни один из них не равен 1. Это и есть причина ошибки.
Разберём конкретный случай из сообщения выше:
import numpy as np
a = np.array([1, 2, 3]) # shape (3,)
b = np.ones((3, 4)) # shape (3, 4)
# a + b → ValueError
Применяем алгоритм:
- Shape
a:(3,)→ после выравнивания:(1, 3) - Shape
b:(3, 4)→ без изменений - Ось 0:
1и3→ ок, единица растянется - Ось 1:
3и4→ 3 ≠ 4, ни один не равен 1 → несовместимы
Именно ось 1 ломает операцию. Вектор a из трёх элементов выровнялся как строка (1, 3), а у b по оси 1 стоит 4 — растянуть невозможно.
Ещё один пример — чуть менее очевидный:
x = np.ones((2, 3)) # shape (2, 3)
y = np.ones((4,)) # shape (4,)
# x + y → ValueError
Диагностика:
yпосле выравнивания:(1, 4)- Ось 0:
2и1→ ок - Ось 1:
3и4→ 3 ≠ 4, ни один не равен 1 → ошибка
Поверхностно кажется, что 2D-массив и вектор из 4 элементов должны как-то сочетаться. Но после выравнивания вектор встаёт во вторую ось как (1, 4), а там уже стоит 3 — несовместимо.
Главное, что даёт этот разбор: знать, где именно добавить единичную ось, чтобы исправить ошибку. Как только понятно, какая ось проблемная и какому операнду нужна единица в этой позиции — исправление становится механическим. Об этом — в следующем разделе.
