У вас матрица признаков X формы (1000, 3). Вы делаете центрирование столбцов: X_centered = X - X.mean(axis=0). Почему это работает без цикла for?

AX.mean(axis=0) возвращает матрицу формы (1000, 3), повторяя строки X.
BX.mean(axis=0) возвращает одно число, которое вычитается из всех элементов матрицы.
CX.mean(axis=0) меняет X на месте, а вычитание после этого не делает ничего.
DX.mean(axis=0) возвращает вектор формы (3,), и broadcasting вычитает его из каждой строки.
Правильный ответ. Среднее по axis=0 возвращает вектор формы (3,), и NumPy через broadcasting вычитает его из каждой строки X.

Разбор

X.mean(axis=0) сворачивает измерение строк и оставляет вектор по столбцам — для матрицы (1000, 3) получается форма (3,). При операции X - mean правила broadcasting автоматически растягивают вектор по строкам, и из каждой строки вычитается одно и то же среднее значение по соответствующему столбцу. Это и даёт центрированную матрицу той же формы (1000, 3). Никакой in-place мутации X mean() не делает, и вернуть отдельное число (а не вектор) могло бы только X.mean() без axis.

Проверь себя · 1/3разбор после ответа
Есть матрица продаж sales формы (12, 5): строки — месяцы, столбцы — продукты. Как получить сумму продаж по каждому продукту за все месяцы?
Тренировать Python в Telegram

Ещё вопросы по теме «NumPy: основы»