Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
NumPy: Фундамент Python Data Science
Определение
NumPy (Numerical Python) - это самая базовая и важная библиотека для численных вычислений в Python. Она предоставляет:
- N-мерные массивы (ndarray)
- Матричные операции
- Линейную алгебру
- Статистические функции
- Инструменты для генерации случайных чисел
История
2006: Трэвис Олифант создаёт NumPy
(объединил Numeric и Numarray)
2020+: NumPy становится стандартом для всех ML библиотек
Почему NumPy так важна?
Сравнение: Python List vs NumPy Array
# Python List (медленно)
list_data = [1, 2, 3, 4, 5]
result = [x * 2 for x in list_data] # медленно, интерпретируется
# NumPy (быстро)
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
result = arr * 2 # векторизовано, выполняется в C
# Скорость: NumPy в 10-100x быстрее!
Причина: NumPy использует C код под капотом, а не интерпретирует Python.
Основные компоненты
1. Массив (ndarray)
import numpy as np
# 1D массив (вектор)
arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d.shape) # (5,)
# 2D массив (матрица)
arr_2d = np.array([[1, 2, 3],
[4, 5, 6]])
print(arr_2d.shape) # (2, 3)
# 3D массив (тензор)
arr_3d = np.array([[[1, 2], [3, 4]],
[[5, 6], [7, 8]]])
print(arr_3d.shape) # (2, 2, 2)
Ключевое отличие от List:
- Все элементы одного типа (int32, float64 и т.д.)
- Зафиксированный размер
- Очень быстрые операции
2. Создание массивов
# Нули
np.zeros((3, 3)) # матрица 3x3 из нулей
# Единицы
np.ones((2, 4)) # матрица 2x4 из единиц
# Случайные числа
np.random.rand(3, 3) # случайные [0, 1]
np.random.randn(3, 3) # из нормального распределения
# Диапазон
np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1]
3. Индексирование и срезы
arr = np.array([1, 2, 3, 4, 5])
# Индексирование
print(arr[0]) # 1
print(arr[-1]) # 5 (последний)
# Срезы
print(arr[1:4]) # [2, 3, 4]
print(arr[::2]) # [1, 3, 5] (каждый второй)
# 2D индексирование
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
print(matrix[0, 1]) # 2 (строка 0, колонка 1)
print(matrix[1, :]) # [4, 5, 6] (вся вторая строка)
4. Операции с массивами
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# Арифметика (поэлементная)
print(a + b) # [5, 7, 9]
print(a * b) # [4, 10, 18]
print(a / b) # [0.25, 0.4, 0.5]
# Матричные операции
matrix_a = np.array([[1, 2], [3, 4]])
matrix_b = np.array([[5, 6], [7, 8]])
# Матричное умножение
np.dot(matrix_a, matrix_b) # правильное матричное умножение
matrix_a @ matrix_b # то же самое (более новый синтаксис)
# Транспонирование
matrix_a.T # перевернуть строки и колонки
5. Агрегирующие функции
arr = np.array([1, 2, 3, 4, 5])
print(np.sum(arr)) # 15
print(np.mean(arr)) # 3.0
print(np.std(arr)) # стандартное отклонение
print(np.min(arr)) # 1
print(np.max(arr)) # 5
# По осям
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
print(np.sum(matrix, axis=0)) # [5, 7, 9] (по столбцам)
print(np.sum(matrix, axis=1)) # [6, 15] (по строкам)
6. Линейная алгебра
import numpy.linalg as la
# Определитель
matrix = np.array([[1, 2], [3, 4]])
det = la.det(matrix) # -2
# Обратная матрица
inv = la.inv(matrix)
# Решение системы уравнений
# Ax = b
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
x = la.solve(A, b) # решение
# Собственные значения
eigenvalues, eigenvectors = la.eig(matrix)
Практический пример: Машинное обучение
import numpy as np
# Датасет: 100 примеров, 3 признака
X = np.random.randn(100, 3)
y = np.random.randint(0, 2, 100) # бинарная классификация
# Разделить на train/test
idx = np.random.permutation(100)
train_idx = idx[:80]
test_idx = idx[80:]
X_train = X[train_idx]
y_train = y[train_idx]
X_test = X[test_idx]
y_test = y[test_idx]
print(f"Train: {X_train.shape}, Test: {X_test.shape}")
# Нормализация (стандартизация)
mean = np.mean(X_train, axis=0)
std = np.std(X_train, axis=0)
X_train_norm = (X_train - mean) / std
X_test_norm = (X_test - mean) / std
# Простая регрессия: найти w такой что X*w ≈ y
# Решение: w = (X^T X)^-1 X^T y
w = np.linalg.solve(X_train.T @ X_train, X_train.T @ y_train)
print(f"Веса: {w}")
# Предсказание
y_pred = X_test @ w
print(f"Предсказания: {y_pred}")
# Ошибка
mse = np.mean((y_pred - y_test) ** 2)
print(f"MSE: {mse}")
Связь с другими библиотеками
NumPy
↓
Pandas (табличные данные, построена на NumPy)
↓
Scikit-learn (машинное обучение)
↓
TensorFlow, PyTorch (глубокое обучение)
Все бо́льшие ML библиотеки используют NumPy как foundation.
Важные концепции
1. Broadcasting
a = np.array([[1, 2, 3],
[4, 5, 6]]) # shape (2, 3)
b = np.array([10, 20, 30]) # shape (3,)
# NumPy автоматически "расширяет" b к (2, 3)
result = a + b
# [[11, 22, 33],
# [14, 25, 36]]
Это очень мощный механизм для векторизации кода.
2. Vectorization
# Плохо (медленно)
def add_one_slow(arr):
for i in range(len(arr)):
arr[i] += 1
# Хорошо (быстро)
def add_one_fast(arr):
return arr + 1 # NumPy vectorizes this
3. Memory эффективность
# NumPy использует continuous memory block
# это позволяет GPU и CPU кэшам работать эффективно
arr = np.arange(1000000)
# занимает ~4MB (float32) вместо многих MB для Python list
Когда использовать NumPy
Используй NumPy когда:
- Работаешь с числовыми данными
- Нужны матричные операции
- Нужна скорость
- Работаешь в ML/Data Science
НЕ используй NumPy когда:
- Данные очень структурированы (используй Pandas)
- Нужны графики (используй Matplotlib)
- Нужна визуализация данных (используй Plotly)
Практический совет
Используй NumPy "vectorized" операции, а не loops:
# Очень плохо (1000x медленнее)
result = []
for i in range(1000000):
result.append(data[i] * 2)
# Отлично (1000x быстрее)
result = data * 2
Заключение
NumPy - это не просто библиотека, это язык для работы с числовыми данными в Python. Без NumPy не было бы pandas, scikit-learn, TensorFlow. Это fundamental инструмент для любого Data Scientist и ML Engineer.