NumPy: основы: вопросы для собеседования (часть 4)

NumPy — фундамент для числовых вычислений в Python и основа pandas, scipy, sklearn. На собеседовании спрашивают про ndarray, broadcasting, векторизацию, индексирование массивов и разницу в производительности с чистым Python. Понимание NumPy показывает, что аналитик готов работать с данными эффективно.

Коллекции и структуры данныхГенераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVФункции и аргументыИтераторы и генераторыPandas и DataFrameСинтаксис и типы данных

Вопросы 1620 из 20

16Пусть `x = np.array([[1, 2], [3, 4]])`. Чему равен результат `np.sum(x, axis=0)`?
A`np.array([4, 6])`
B`np.array([3, 7])`
C`np.array([2, 3])`
DСкалярное значение `10`
Ответ: `axis=0` агрегирует вдоль вертикальной оси, поэтому `np.sum` считает сумму в каждом столбце.

В двумерном массиве у `axis=0` направление «вниз»: операция проходит по строкам и сворачивает их в один результат на столбец. Для `x = [[1, 2], [3, 4]]` суммы по столбцам равны `1 + 3 = 4` и `2 + 4 = 6`, итог — `np.array([4, 6])`. Если поставить `axis=1`, агрегация идёт «вправо», по строкам, и получится `np.array([3, 7])`. Без указания `axis` `np.sum(x)` сворачивает массив целиком и возвращает скаляр `10`.

Подробный разбор →
17Пусть `arr = np.array([[10, 20, 30], [40, 50, 60]])`. Что вернёт выражение `arr[:, 1]`?
A`np.array([20, 50])`: второй столбец, выбранный для всех строк через срез `[:, 1]`
B`np.array([10, 40])`: первый столбец с индексом `0`, а не запрошенный второй
C`np.array([30, 60])`: третий столбец с индексом `2`, а не запрошенный индекс `1`
D`np.array([[20], [50]])`: форма `2x1` вместо одномерного результата `arr[:, 1]`
Ответ: Срез `arr[:, j]` выбирает весь столбец `j` из 2D массива и возвращает 1D массив.

В записи `arr[:, 1]` двоеточие означает «все строки», а индекс 1 — второй столбец. Поэтому возвращается столбец `[20, 50]` как одномерный массив. Если хотелось получить первый столбец, нужно было бы написать `arr[:, 0]`, а для третьего — `arr[:, 2]`. Срез по столбцу из 2D массива даёт 1D, а не 2D с формой `(n, 1)`.

Подробный разбор →
18У вас матрица признаков `X` формы (1000, 3). Вы делаете центрирование столбцов: `X_centered = X - X.mean(axis=0)`. Почему это работает без цикла `for`?
A`X.mean(axis=0)` возвращает матрицу формы (1000, 3), повторяя строки `X`.
B`X.mean(axis=0)` возвращает одно число, которое вычитается из всех элементов матрицы.
C`X.mean(axis=0)` меняет `X` на месте, а вычитание после этого не делает ничего.
D`X.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`.

Подробный разбор →
19Какое из сложений `a + b` вызовет ошибку broadcasting из-за несовместимых форм?
A`a` формы (5,), `b` — скаляр (например, 2).
B`a` формы (2, 3), `b` формы (1, 3).
C`a` формы (3, 1), `b` формы (4,).
D`a` формы (2, 3), `b` формы (2,).
Ответ: Для broadcasting размеры должны совпадать или один из них должен быть 1 (сравнение идёт справа налево).

Broadcasting сравнивает формы по осям справа налево. Для (2, 3) и (2,) сравниваются последние оси: 3 и 2 — они не равны и ни одна не равна 1, значит формы несовместимы и выражение `a + b` упадёт с ошибкой. Умение проверять совместимость форм экономит много времени при отладке.

Подробный разбор →
20Пусть `a = np.array([[1], [2], [3]])` и `b = np.array([10, 20, 30, 40])`. Какой будет форма результата `a + b`?
A(3, 1)
B(4,)
C(3, 4)
DБудет ошибка broadcasting
Ответ: Массив формы (3, 1) и вектор формы (4,) broadcastятся в матрицу формы (3, 4).

Форма (3, 1) означает «3 строки и 1 столбец». При сложении с вектором (4,) NumPy приводит формы справа налево: (3, 1) и (4,) становятся совместимыми как (3, 1) и (1, 4), после чего broadcasting даёт результат (3, 4). Это полезно для построения «сетки» значений без циклов.

Подробный разбор →
1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать Python в Telegram

Другие темы: Python

Коллекции и структуры данныхГенераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVФункции и аргументыИтераторы и генераторыPandas и DataFrameСинтаксис и типы данных