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

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

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

Вопросы 1115 из 20

11В массиве `scores` формы (100, 7) строки — пользователи, столбцы — дни недели. Как посчитать среднее значение для каждого пользователя (по строкам)?
A`np.mean(scores, axis=0)`: сворачивает строки и даёт среднее по каждому дню недели
B`np.mean(scores)`: одно число со средним по всем ячейкам матрицы целиком
C`np.mean(scores, axis=2)`: обращение к третьей оси у двумерного массива формы (100, 7)
D`np.mean(scores, axis=1)`: сворачивает столбцы и даёт среднее на каждого пользователя
Ответ: Среднее по строкам в двумерном массиве считается через `axis=1`.

Если строки — пользователи, то «среднее по пользователю» означает свернуть столбцы (дни недели) и оставить одну величину на строку. Это `np.mean(scores, axis=1)`, результат будет одномерный массив длины 100. `axis=0` свернул бы строки и дал бы среднее по каждому дню недели (длина 7). Без указания оси возвращается одно число — среднее по всему массиву.

Подробный разбор →
12Почему при работе с числовыми данными для аналитики часто предпочитают `ndarray` вместо Python `list`?
A`ndarray` обычно однороден по типу (`dtype`), хранит данные компактнее и поддерживает быстрые поэлементные операции
B`ndarray` хорош тем, что хранит значения разных типов вперемешку быстрее, чем `list`, без накладных расходов на упаковку каждого элемента
CПотому что `list` поддерживает векторные операции и `broadcasting`, а `ndarray` для этого нужно дополнительно настраивать через сторонние пакеты
DПотому что `ndarray` автоматически хранит данные на диске, а не в памяти, и сам подгружает только нужные блоки во время вычислений
Ответ: Однородность типов и компактное хранение делают `ndarray` удобным для численной аналитики.

Python `list` может содержать разные типы, но это неоптимально для больших числовых массивов. NumPy `ndarray` обычно имеет один `dtype`, что позволяет хранить данные плотнее и выполнять векторные операции быстрее. Утверждение про разные типы в `ndarray` ошибочно: однородность типов — это плюс, а не минус. `Broadcasting` поддерживает именно `ndarray`, а не `list`. На диск массив сам не уходит — это работа специальных библиотек, а не базового NumPy.

Подробный разбор →
13Есть матрица продаж `sales` формы (12, 5): строки — месяцы, столбцы — продукты. Как получить сумму продаж по каждому продукту за все месяцы?
A`np.sum(sales, axis=1)`: сворачивает столбцы и даёт сумму по каждому месяцу
B`np.sum(sales, axis=0)`: сворачивает строки и даёт сумму по каждому продукту
C`np.sum(sales)`: одно число с общей суммой по всей матрице без разбивки
D`np.sum(sales, axis=2)`: обращение к третьей оси у двумерного массива
Ответ: Чтобы получить суммы по столбцам, нужно сворачивать строки — то есть указать `axis=0`.

В табличной логике «продукты в столбцах» означает: агрегировать вдоль строк (месяцев) и оставить столбцы — это `np.sum(sales, axis=0)`. Если перепутать ось, легко получить «правильные числа не того смысла» — частая ошибка в аналитике. `np.sum(sales)` без оси даёт одно число общей суммы, а `axis=2` упадёт с ошибкой для двумерного массива.

Подробный разбор →
14Вы считаете метрику по большому массиву чисел и выбираете NumPy вместо Python `list`. Почему операции вроде `arr * 1.1` на `ndarray` обычно быстрее, чем цикл `for` по `list`?
A`ndarray` хранит данные однородно и выполняет операции в оптимизированном `C`-коде, минимизируя `Python`-циклы.
B`list` хранит числа компактным блоком в одной области памяти, а `ndarray` использует `pointer`-ссылки и за счёт этого быстрее.
C`ndarray` по умолчанию выполняет вычисления на `GPU` без явных настроек и установки `CUDA`-библиотек.
D`ndarray` хранит в массиве разные типы (`int`, `float`, `str`) и переключается между ними быстрее, чем `list`.
Ответ: Ускорение `ndarray` идёт за счёт однородного типа, непрерывной памяти и векторизованного C-кода, который минимизирует накладные расходы Python.

Массив NumPy фиксирует один dtype, лежит в непрерывной области памяти и обрабатывается компилированными C-функциями (BLAS/SIMD). Поэтому `arr * 1.1` запускает один внутренний цикл на C, а не цикл по объектам Python. У обычного `list` всё наоборот: он хранит ссылки на разнотипные объекты, и каждое умножение требует диспетчеризации Python. NumPy не запускает GPU автоматически — для этого нужны отдельные библиотеки (например, CuPy/JAX). Хранение «разных типов в одном массиве» — это про `dtype=object`, и оно как раз медленнее обычного NumPy.

Подробный разбор →
15Пусть `m = np.array([[1, 2, 3], [4, 5, 6]])`. Чему равен `np.mean(m, axis=1)`?
AСкаляр 3.5
B`np.array([2, 5, 8])`
C`np.array([2, 3, 4])`
D`np.array([2., 5.])`
Ответ: `axis=1` агрегирует по столбцам внутри строки: среднее по каждой строке.

Для 2D массива `axis=1` означает: «свернуть столбцы, получить результат на каждую строку». В первой строке среднее (1+2+3)/3 = 2, во второй (4+5+6)/3 = 5, поэтому результат `np.array([2., 5.])`. Это типичный приём для расчёта метрик по объектам (строкам).

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

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

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

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

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

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