NumPy: вычисления и устройство массивов

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 и 43 ≠ 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 и 43 ≠ 4, ни один не равен 1 → ошибка

Поверхностно кажется, что 2D-массив и вектор из 4 элементов должны как-то сочетаться. Но после выравнивания вектор встаёт во вторую ось как (1, 4), а там уже стоит 3 — несовместимо.

Главное, что даёт этот разбор: знать, где именно добавить единичную ось, чтобы исправить ошибку. Как только понятно, какая ось проблемная и какому операнду нужна единица в этой позиции — исправление становится механическим. Об этом — в следующем разделе.