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

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

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

Вопросы 610 из 20

6Что будет результатом выражения `arr + 10`, если `arr = np.array([1, 2, 3])`?
AОшибка типов: прибавить скаляр к массиву можно только через явный цикл
B`[1, 2, 3, 10]`: число `10` дописывается в конец массива как новый элемент
C`np.array([11, 12, 13])`: скаляр `10` прибавляется к каждому элементу через broadcasting
DСкаляр `16`: массив сворачивается в сумму элементов и прибавляется к скаляру
Ответ: При `broadcasting` скаляр применяется ко всем элементам массива поэлементно.

`broadcasting` в NumPy позволяет выполнять операции между массивом и скаляром без явного цикла. В выражении `arr + 10` число 10 «растягивается» до формы массива и прибавляется к каждому элементу, что даёт `np.array([11, 12, 13])`. Это базовый приём векторных вычислений и одна из причин, почему `numpy` быстрее обычных списков.

Подробный разбор →
7После `import numpy as np` вы сравниваете операции над списком Python `list` и массивом `np.ndarray`. Что верно для `lst * 2` и `arr * 2`, где `lst = [1, 2, 3]`, а `arr = np.array([1, 2, 3])`?
AОбе операции вызовут ошибку типов и потребуют явного приведения коллекции к числу.
BОбе операции повторят значения два раза, как обычная склейка списка с самим собой.
C`lst * 2` повторит элементы списка два раза, а `arr * 2` умножит каждый элемент массива на 2 поэлементно.
DОбе операции умножат элементы поэлементно, как стандартное арифметическое умножение для коллекций.
Ответ: Для `list` оператор `*` означает повторение, а для `np.ndarray` — поэлементное арифметическое умножение через векторизацию.

Оператор `*` в Python перегружается типами, а не имеет универсального арифметического смысла. У списка `lst * 2` — это конкатенация со своей копией, поэтому `[1, 2] * 2` даёт `[1, 2, 1, 2]`. У `np.ndarray` — поэлементное умножение, поэтому `arr * 2` для `np.array([1, 2])` даёт `np.array([2, 4])`. Никакой ошибки типов здесь не возникает: оба варианта валидны, просто делают разные вещи.

Подробный разбор →
8Вы сравниваете сложение для `list` и `ndarray`. Что верно для выражений `[1, 2] + [3, 4]` и `np.array([1, 2]) + np.array([3, 4])`?
AОбе операции дают `np.array([4, 6])`, потому что `+` ведёт себя одинаково для `list` и `ndarray`
BОбе операции вызывают `TypeError`, потому что у `list` и `ndarray` разные внутренние типы хранения
CДля `ndarray` `+` делает конкатенацию, а для `list` `+` делает поэлементное сложение элементов
DДля `list` `+` делает конкатенацию, а для `ndarray` `+` делает поэлементное сложение (векторизация)
Ответ: У `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` форма `(1, 3)`, у массива `b` форма `(3,)`: внешние скобки на размерность не влияют
BОба массива `a` и `b` 2D: наличие хотя бы одной пары `[]` в литерале даёт две оси сразу
CОба массива `a` и `b` 1D: все их элементы остаются обычными числовыми значениями скаляра типа
DУ `a` ndim равен 1 и shape равен `(3,)`, у `b` ndim равен 2 и shape равен `(1, 3)`
Ответ: Один уровень скобок даёт 1D массив, два уровня — 2D массив с одной строкой.

Выражение `a = np.array([1, 2, 3])` создаёт 1D массив из 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).

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

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

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

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

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

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