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

Идея простая: если размеры массивов совместимы, NumPy логически “растягивает” массив меньшей размерности до нужной формы и выполняет векторизованную операцию.

Зачем это нужно:

– писать выражения без явных циклов
– избегать ручного reshape и tile
– сохранять производительность и компактность кода

Базовая идея на примере:

a = np.array([1, 2, 3])      # shape (3,)
b = 10
 
a + b

Скаляр b трактуется как массив формы (3,) с одинаковыми значениями.

Пример с осями:

a = np.ones((2, 3))          # shape (2, 3)
b = np.array([10, 20, 30])   # shape (3,)
 
a + b

b логически расширяется до (2, 3) и складывается построчно.

Правила совместимости форм (упрощённо):

Сравнение идёт справа налево по осям.

Два измерения совместимы, если:
– они равны
– или одно из них равно 1

Если правило нарушено — broadcasting невозможен.

Пример:

(2, 3)
(1, 3)   # совместимо
(2, 3)
(2, 1)   # совместимо
(2, 3)
(2, 2)   # несовместимо

Ключевой момент:

Broadcasting не копирует данные. NumPy использует strides, чтобы один и тот же элемент логически участвовал в операции много раз.

Практические применения:

– прибавление вектора к каждой строке или столбцу матрицы
– нормализация данных
– центрирование, масштабирование
– работа с батчами в ML

Типичная ошибка на практике — путаница между формами (n,), (1, n) и (n, 1). Явный reshape часто делает намерение кода понятнее и безопаснее.

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