Broadcasting NumPy по строкам и столбцам: формы и пример
Broadcasting NumPy сопоставляет размеры массивов справа налево. Размеры совместимы, если равны или один из них равен 1; для операции по строкам часто нужна форма (n, 1).
Почему суммы строк нужно превратить в столбец
После a.sum(axis=1) у матрицы формы (n, m) получается вектор (n,). При делении он сопоставляется с последней осью матрицы, а не автоматически с её строками. Добавьте единичную ось через [:, None] или сохраните её через keepdims=True.
Для операции по столбцам вектор формы (m,) уже согласован с последней осью. Перед нормализацией проверьте знаменатель: корректная форма не защищает от деления на ноль. Ошибка operands could not be broadcast together требует сначала сопоставить формы.
Пример на других данных
import numpy as np
a = np.array([[2., 6.], [3., 9.], [5., 15.]])
sums = a.sum(axis=1, keepdims=True)
print(sums.shape)
print((a / sums).tolist())
Результат:
(3, 1)
[[0.25, 0.75], [0.25, 0.75], [0.25, 0.75]]
Попробуйте сами
Ниже — отдельное упражнение: напишите код и запустите проверку. Другие упражнения по этой теме. Для обучения по порядку откройте бесплатный курс NumPy и pandas.
Broadcasting: нормализация строк и столбцов матрицы
Что уже дано
Проверяющая система запускает вашу программу и подаёт данные через stdin. Никаких заранее созданных переменных нет — вы читаете всё сами.
Что нужно сделать
Напишите программу, которая:
- Читает из
stdinдва целых числаRиC— число строк и столбцов матрицы. - Читает следующие
Rстрок; каждая содержит ровноCцелых чисел через пробел. Создаёт двумерный массивMчерезnp.array(..., dtype=float)формы(R, C). - Нормализация по строкам. Вычисляет сумму каждой строки через
np.sum(M, axis=1)— результат shape(R,). ДелитMна эти суммы через broadcasting, добавив ось через[:, np.newaxis]илиreshape(-1, 1), чтобы делитель стал формы(R, 1). Сохраняет результат вnorm_rows— shape(R, C). Выводит shapenorm_rowsв одну строку. - Нормализация по столбцам. Вычисляет максимум каждого столбца через
np.max(M, axis=0)— результат shape(C,). ДелитMна эти максимумы через broadcasting (форма(C,)совместима с(R, C)напрямую). Сохраняет результат вnorm_cols— shape(R, C). Выводит shapenorm_colsв одну строку. - Выводит через пробел два значения:
norm_rows[0, 0]иnorm_cols[0, 0], округлённых до одного знака после запятой.
Ввод и вывод
Программа читает stdin и пишет в stdout.
Формат ввода
Первая строка: два целых числа R и C через пробел.
Следующие R строк: по C целых чисел через пробел.
Гарантируется: R >= 2, C >= 2, все элементы матрицы положительны.
Формат вывода
Три строки:
- shape
norm_rowsв виде кортежа Python, например(2, 4); - shape
norm_colsв виде кортежа Python, например(2, 4); - два значения через пробел:
norm_rows[0, 0]иnorm_cols[0, 0], каждое с одним знаком после запятой.
Пример
- Ввод
2 4 1 2 3 4 2 4 6 8
- Вывод
(2, 4) (2, 4) 0.1 0.5
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- NumPy broadcasting: какая форма будет у суммы массивов
- NumPy broadcasting: outer-таблица и центрирование строк
- dtype NumPy: целые и вещественные массивы, типы элементов
- NumPy shape, ndim, size и dtype: атрибуты массива и задача
- Срезы двумерного массива NumPy: строки, столбцы и шаг
- NumPy reshape и transpose: разница на примере и задача
