0Pricing
Pandas & NumPy Academy · Урок

Правила broadcasting

Разберитесь в правилах broadcasting NumPy, чтобы складывать одномерный массив с каждой строкой двумерного массива без явного дублирования

«Правила broadcasting» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Pandas & NumPy Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Какую проблему решает broadcasting

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

import numpy as np

# Adding a scalar to an array is the simplest broadcast
a = np.array([1, 2, 3])
print(a + 10)  # [11 12 13]
# Scalar 10 is 'broadcast' to shape (3,)

Правило broadcasting 1: добавление единиц слева

NumPy выравнивает формы справа налево. Если у одного массива меньше измерений, слева добавляются единицы — поэтому массив формы (3,) рядом с массивом формы (4, 3) ведёт себя как массив формы (1, 3).

import numpy as np

m = np.ones((4, 3))
v = np.array([10, 20, 30])  # shape (3,) -> treated as (1, 3)

result = m + v   # shape (4, 3)
print(result)
# [[11. 21. 31.]
#  [11. 21. 31.]
#  [11. 21. 31.]
#  [11. 21. 31.]]

Правило broadcasting 2: растягивание измерений размера 1

Любое измерение размера 1 можно растянуть до размера другого массива — данные при этом фактически не копируются. Оба массива могут одновременно растягивать свои измерения размера 1.

import numpy as np

# (3, 1) + (1, 4)  -->  (3, 4)
col = np.array([[1], [2], [3]])    # shape (3, 1)
row = np.array([[10, 20, 30, 40]]) # shape (1, 4)
print((col + row).shape)  # (3, 4)
print(col + row)

Правило broadcasting 3: несовместимые формы

Если два измерения не равны и ни одно из них не равно 1, broadcasting завершается ошибкой ValueError. Предварительная проверка форм позволяет получить понятную ошибку, а не незаметную ошибку в логике.

import numpy as np

a = np.ones(3)
b = np.ones(4)
try:
    a + b
except ValueError as e:
    print(e)
# operands could not be broadcast together with shapes (3,) (4,)

Практика: вычитание среднего по столбцам

Классический приём: вычесть среднее каждого столбца из каждой строки, чтобы центрировать данные. При использовании keepdims=True среднее сохраняет форму, совместимую с broadcasting.

import numpy as np

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

col_mean = data.mean(axis=0)          # shape (3,)
centred = data - col_mean             # broadcast along axis 0
print(centred)
# [[-3. -3. -3.]
#  [ 0.  0.  0.]
#  [ 3.  3.  3.]]

Практика: нормализация строк

Чтобы сумма элементов каждой строки была равна 1, разделите её элементы на сумму строки. Используйте keepdims=True, чтобы сумма сохранила форму (n, 1) и распространилась по столбцам.

import numpy as np

m = np.array([[1., 2., 3.],
              [4., 5., 6.]])

row_sums = m.sum(axis=1, keepdims=True)  # shape (2, 1)
normed = m / row_sums
print(normed.round(3))
# [[0.167 0.333 0.5  ]
#  [0.267 0.333 0.4  ]]

Внешние произведения с помощью broadcasting

Измените форму одного массива на (n, 1), а другого — на (1, m), затем перемножьте их: broadcasting построит для Вас полную матрицу внешнего произведения, и циклы не понадобятся.

import numpy as np

a = np.array([1, 2, 3])
b = np.array([10, 20, 30, 40])

outer = a[:, np.newaxis] * b[np.newaxis, :]
print(outer)
# [[ 10  20  30  40]
#  [ 20  40  60  80]
#  [ 30  60  90 120]]

Broadcasting с трёхмерными массивами

Broadcasting работает с любым количеством измерений. Набор изображений формы (100, 28, 28) можно центрировать с помощью среднего по каждому пикселю формы (1, 28, 28) — NumPy растянет единичное измерение.

import numpy as np

batch = np.random.rand(100, 28, 28)  # 100 images
pixel_mean = batch.mean(axis=0, keepdims=True)  # (1, 28, 28)
centred = batch - pixel_mean          # (100, 28, 28)
print(centred.shape)  # (100, 28, 28)

np.broadcast_to для явного растягивания

np.broadcast_to показывает, что именно создаёт broadcasting, в виде доступного только для чтения представления без копирования. Это идеально подходит для наглядного понимания выравнивания форм.

import numpy as np

a = np.array([1, 2, 3])
view = np.broadcast_to(a, (4, 3))
print(view)
# [[1 2 3]
#  [1 2 3]
#  [1 2 3]
#  [1 2 3]]
print(view.flags.writeable)  # False

Наглядное сравнение совместимых форм

Полезное правило: выравнивайте формы справа налево и проверяйте каждую пару. Формы совместимы, если они равны или одна из них равна 1. Предсказывайте формы до запуска кода!

# Shape compatibility examples:
# (3, 4) + (   4) -> (3, 4)  OK: 4==4, 1 implied
# (3, 4) + (3, 1) -> (3, 4)  OK: 4 vs 1, 3==3
# (2, 3, 4) + (3, 4) -> (2, 3, 4)  OK
# (3, 4) + (3,  ) -> ERROR: 4 vs 3
import numpy as np
print(np.zeros((3,4)).shape)       # (3, 4)
print((np.zeros((3,4)) + np.zeros(4)).shape)  # (3, 4)

Распространённые ошибки при broadcasting

Самая частая ошибка при broadcasting — забыть указать keepdims=True после агрегирования, из-за чего формы перестают выравниваться. Если что-то не получается, выведите print(arr.shape), чтобы увидеть, что происходит на самом деле.

import numpy as np

m = np.arange(6).reshape(2, 3)
row_max = m.max(axis=1)            # shape (2,)  NOT (2,1)
print(row_max.shape)               # (2,)
# m - row_max  -> ERROR: shapes (2,3) and (2,) misalign

row_max_col = row_max[:, np.newaxis]  # shape (2, 1)
print((m - row_max_col).shape)     # (2, 3)  OK

Быстрая проверка

Проверьте, насколько Вы поняли правила broadcasting в NumPy из этого урока.

Повторение урока

Отлично! Broadcasting растягивает измерения размера 1, сравнивает формы справа налево, а keepdims=True сохраняет оси, чтобы вычисления выравнивались. Далее: булева маска.

Часто задаваемые вопросы

Урок «Правила broadcasting» бесплатный?

Да — полный текст урока «Правила broadcasting» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Правила broadcasting»?

Разберитесь в правилах broadcasting NumPy, чтобы складывать одномерный массив с каждой строкой двумерного массива без явного дублирования Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Pandas & NumPy Academy?

Предыдущий опыт не требуется. Pandas & NumPy Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Правила broadcasting»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Pandas & NumPy Academy?

Да. Каждый урок Pandas & NumPy Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Универсальные функции (ufuncs)
  2. Агрегирующие функции
  3. Правила broadcasting
  4. Булева маска и расширенная индексация
← Назад к Pandas & NumPy Academy