NumPy: основы: вопросы для собеседования (часть 2)
NumPy — фундамент для числовых вычислений в Python и основа pandas, scipy, sklearn. На собеседовании спрашивают про ndarray, broadcasting, векторизацию, индексирование массивов и разницу в производительности с чистым Python. Понимание NumPy показывает, что аналитик готов работать с данными эффективно.
Вопросы 6–10 из 20
6Что будет результатом выражения `arr + 10`, если `arr = np.array([1, 2, 3])`?
AБудет ошибка, потому что нельзя прибавлять число к массиву.
BПолучится список `[1, 2, 3, 10]` (как добавление элемента).
CПолучится `np.array([11, 12, 13])`.
DПолучится скаляр 16.
Ответ: При broadcasting скаляр применяется ко всем элементам `ndarray` поэлементно.
Broadcasting в NumPy позволяет выполнять операции между массивом и скаляром без явного цикла. В выражении `arr + 10` число 10 «растягивается» до формы массива и прибавляется к каждому элементу, что даёт `np.array([11, 12, 13])`.
7После `import numpy as np` вы сравниваете операции над Python `list` и NumPy `ndarray`. Что верно для `lst * 2` и `arr * 2`, где `lst = [1, 2, 3]`, а `arr = np.array([1, 2, 3])`?
A`lst * 2` повторит элементы списка два раза, а `arr * 2` умножит каждый элемент массива на 2.
BОбе операции умножат элементы поэлементно.
CОбе операции повторят значения два раза (как склейка).
DОбе операции вызовут ошибку типов.
Ответ: У `list` оператор `*` повторяет список, а у `ndarray` он выполняет поэлементную арифметику.
В Python `list` — контейнер, и выражение `lst * 2` означает «повторить элементы списка». NumPy `ndarray` предназначен для численных операций, поэтому `arr * 2` — это поэлементное умножение (векторизация). Это одно из ключевых отличий `list` vs `ndarray` и частая причина, почему аналитики выбирают NumPy для массивов чисел.
8Вы сравниваете сложение для `list` и `ndarray`. Что верно для выражений `[1, 2] + [3, 4]` и `np.array([1, 2]) + np.array([3, 4])`?
AОбе операции дают `np.array([4, 6])`.
BДля `list` `+` делает конкатенацию, а для `ndarray` `+` делает поэлементное сложение.
CДля `ndarray` `+` делает конкатенацию, а для `list` — поэлементное сложение.
DОбе операции вызывают ошибку, потому что типы разные.
Ответ: У `list` `+` — это склейка, у `ndarray` `+` — арифметика поэлементно.
Одинаковый оператор может иметь разные смыслы. В аналитике это частая причина багов при переходе с `list` на NumPy: для `ndarray` выражение `np.array([1, 2]) + np.array([3, 4])` даёт `np.array([4, 6])` (векторизация), а не «склейку». Понимание этого помогает выбирать NumPy для математики над массивами.
9У вас два массива: `a = np.array([1, 2, 3])` и `b = np.array([[1, 2, 3]])`. Что верно про их размерность и форму?
A`a` и `b` оба 2D, потому что внутри есть квадратные скобки.
B`a` имеет форму (1, 3), а `b` имеет форму (3,).
C`a` имеет `a.ndim` 1 и `a.shape` (3,), а `b` имеет `b.ndim` 2 и `b.shape` (1, 3).
D`a` и `b` оба 1D, потому что элементы числовые.
Ответ: Один уровень скобок даёт 1D массив, два уровня — 2D массив с одной строкой.
`a = np.array([1, 2, 3])` — это 1D `ndarray` из 3 элементов, поэтому `a.ndim` равен 1, а `a.shape` — (3,). `b = np.array([[1, 2, 3]])` — это 2D массив с одной строкой и тремя столбцами: `b.ndim` равен 2, `b.shape` — (1, 3). Это важно для broadcasting и индексации.
10Пусть `a` имеет форму (2, 3), а `b = np.array([10, 20, 30])` имеет форму (3,). Какой будет форма результата `a + b`?
AБудет ошибка broadcasting из-за разных форм.
B(3,)
C(2, 3)
D(2,)
Ответ: Вектор формы (3,) может транслироваться (broadcast) к каждой строке массива формы (2, 3).
При broadcasting NumPy сравнивает размеры справа налево. Для (2, 3) и (3,) последняя ось совпадает (3), поэтому `b` «растягивается» на 2 строки и прибавляется к каждой строке `a`. Итоговая форма остаётся (2, 3).
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram