NumPy для аналитика данных — что нужно знать
NumPy — фундаментальная библиотека Python для работы с числовыми данными. Pandas, scikit-learn, SciPy — все они построены поверх NumPy. Если вы готовитесь к собеседованию на аналитика данных, без NumPy не обойтись: вопросы по нему встречаются регулярно.
Что такое NumPy и зачем он аналитику
NumPy (Numerical Python) — это библиотека для быстрых вычислений над массивами чисел. Главное отличие от обычных списков Python — скорость. NumPy-массивы хранят данные в непрерывном блоке памяти и используют оптимизированный C-код под капотом. Операция, которая на списках Python занимает секунды, в NumPy выполняется за миллисекунды.
Аналитику NumPy нужен для:
- быстрых вычислений над большими массивами данных
- статистических расчётов (среднее, дисперсия, стандартное отклонение)
- подготовки данных для моделей
- работы с Pandas — внутри DataFrame лежат именно NumPy-массивы
ndarray — основа NumPy
Центральный объект библиотеки — ndarray (n-dimensional array). Это многомерный массив, в котором все элементы одного типа.
import numpy as np
# Одномерный массив
a = np.array([1, 2, 3, 4, 5])
print(a.shape) # (5,)
print(a.dtype) # int64
# Двумерный массив (матрица)
m = np.array([[1, 2, 3], [4, 5, 6]])
print(m.shape) # (2, 3)Ключевые атрибуты: shape (размерность), dtype (тип данных), ndim (число осей), size (общее число элементов).
Создание массивов
np.zeros(5) # [0. 0. 0. 0. 0.]
np.ones((2, 3)) # матрица 2x3 из единиц
np.arange(0, 10, 2) # [0, 2, 4, 6, 8] — аналог range
np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1.] — 5 точек от 0 до 1
np.random.randn(1000) # 1000 значений из нормального распределения
np.eye(3) # единичная матрица 3x3arange удобен для целочисленных последовательностей, linspace — когда нужно точное число точек в интервале.
Индексация и срезы
NumPy поддерживает мощную индексацию — от простых срезов до булевых масок:
a = np.array([10, 20, 30, 40, 50])
a[1:3] # [20, 30]
a[a > 25] # [30, 40, 50] — булева индексация
a[[0, 2, 4]] # [10, 30, 50] — fancy indexing
# Для матриц
m = np.array([[1, 2], [3, 4], [5, 6]])
m[0, 1] # 2
m[:, 0] # [1, 3, 5] — весь первый столбецВекторизация — почему NumPy быстрее циклов
Векторизация — главная причина использовать NumPy. Вместо поэлементного цикла Python операция применяется ко всему массиву сразу на уровне C.
# Медленно — цикл Python
result = []
for x in data:
result.append(x * 2 + 1)
# Быстро — векторизация NumPy
result = data * 2 + 1На массиве из миллиона элементов разница — в 50-100 раз. На собеседовании часто спрашивают, почему NumPy быстрее: ответ именно в векторизации и том, что данные хранятся в непрерывной памяти одного типа.
Broadcasting
Broadcasting — механизм, который позволяет выполнять операции над массивами разных размеров без явного копирования данных.
a = np.array([[1, 2, 3],
[4, 5, 6]]) # shape (2, 3)
b = np.array([10, 20, 30]) # shape (3,)
print(a + b)
# [[11 22 33]
# [14 25 36]]NumPy «растягивает» массив b до размера a и поэлементно складывает. Правило: размерности сравниваются справа налево, и они должны совпадать или одна из них равна 1.
Основные функции для аналитика
data = np.array([12, 7, 15, 3, 21, 9])
np.mean(data) # 11.17 — среднее
np.std(data) # 5.73 — стандартное отклонение
np.sum(data) # 67
np.min(data) # 3
np.max(data) # 21
np.argmin(data) # 3 — индекс минимального элемента
np.argmax(data) # 4 — индекс максимального
np.median(data) # 10.5
np.percentile(data, 75) # 75-й перцентильnp.where — условная логика над массивами:
labels = np.where(data > 10, "high", "low")
# ['high', 'low', 'high', 'low', 'high', 'low']reshape — изменение формы
a = np.arange(12) # [0, 1, 2, ..., 11]
b = a.reshape(3, 4) # матрица 3x4
c = a.reshape(2, -1) # -1 = автоподбор → (2, 6)reshape не копирует данные — возвращает view на тот же участок памяти (об этом ниже).
NumPy vs Pandas
NumPy — быстрые числовые вычисления над однородными массивами. Pandas — табличные данные с именованными колонками и разными типами. Подробное сравнение — в статье NumPy vs Pandas.
Коротко: используйте Pandas для загрузки, очистки и анализа табличных данных. NumPy — когда нужна скорость, матричные операции или работа с числовыми массивами напрямую.
Практические примеры
Z-score — нормализация данных
data = np.array([45, 67, 89, 23, 56, 78, 34])
z_scores = (data - np.mean(data)) / np.std(data)
# Отклонение каждого значения от среднего в единицах stdСлучайная выборка
users = np.arange(10000) # ID пользователей
sample = np.random.choice(users, size=500, replace=False)
# 500 случайных пользователей без повторенийМатричные операции
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
np.dot(A, B) # матричное умножение
A @ B # то же самое, короче
A.T # транспонирование
np.linalg.inv(A) # обратная матрицаЧастые ошибки
View vs copy. Срез NumPy-массива — это view, а не копия. Изменение среза меняет оригинал:
a = np.array([1, 2, 3, 4])
b = a[1:3]
b[0] = 99
print(a) # [1, 99, 3, 4] — оригинал изменился!
# Для независимой копии: b = a[1:3].copy()Целочисленное переполнение. int32 вмещает до ~2 млрд. Если складываете большие числа — укажите dtype=np.int64 или dtype=np.float64.
Вопросы с собеседований
Чем ndarray отличается от списка Python? ndarray хранит элементы одного типа в непрерывном блоке памяти. Это даёт фиксированный размер элемента и возможность применять операции ко всему массиву без цикла (векторизация). Результат — в десятки раз быстрее.
Что такое broadcasting и когда он работает? Broadcasting позволяет выполнять операции над массивами разных размеров. Размерности сравниваются справа налево: они должны совпадать или одна из них равна 1. Например, матрицу (3, 4) можно сложить с вектором (4,), но не с вектором (3,) напрямую.
В чём разница между view и copy? View — это ссылка на те же данные. Изменение view меняет оригинал. Copy — независимая копия данных. Срезы создают view, булева индексация — copy.
Как посчитать z-score массива в одну строку?
(data - np.mean(data)) / np.std(data) — вычитаем среднее и делим на стандартное отклонение. Это пример векторизации: все операции применяются ко всему массиву сразу.
Зачем reshape(-1)?
-1 означает «подбери размерность автоматически». a.reshape(3, -1) при a.size == 12 даст форму (3, 4). Удобно, когда одна размерность известна, а вторую можно вычислить.
FAQ
Нужен ли NumPy, если я использую Pandas?
Да. Pandas построен на NumPy, и часто быстрее обработать колонку через .values (это ndarray) напрямую. Понимание NumPy помогает отлаживать проблемы с типами и производительностью в Pandas.
Какую версию NumPy ставить?
Ставьте актуальную через pip install numpy. NumPy 2.x вышел в 2024 году, но для задач аналитика разница с 1.x минимальна. На собеседовании версии не спрашивают.
NumPy или SciPy — что учить первым?
NumPy. SciPy расширяет NumPy статистическими тестами, оптимизацией, интерполяцией. Но без базового понимания массивов и векторизации SciPy будет непонятен.
Потренируйте вопросы по NumPy, Pandas и Python на практике — откройте тренажёр. Больше примеров вопросов — на странице примеры вопросов, а полезные шпаргалки — в статье Pandas шпаргалка.