NumPy — массивы, векторы и матрицы
NumPy (Numerical Python) — стандарт для быстрых численных вычислений в Python. Главный тип — ndarray (n-мерный массив): однородные числа в непрерывном блоке памяти, операции векторизуются без Python-циклов.
Теория векторов и матриц — 342, 343. Пошаговые скрипты с разбором строк — Lab 1129. Pandas и визуализация — 33 — анализ данных.
NumPy vs список Python
list | ndarray | |
|---|---|---|
| Элементы | ссылки на объекты разных типов | значения одного dtype |
Сложение [1,2]+[3,4] | конкатенация списков | поэлементное [4,6] |
| Скорость на миллионах чисел | медленно (цикл в Python) | быстро (C/OpenBLAS) |
| Типичная задача | конфиг, смешанные данные | ML, матрицы, статистика |
Установка
pip install numpy
import numpy as np
Массив ndarray: shape, dtype, ndim
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape) # (2, 3) — 2 строки, 3 столбца
print(a.ndim) # 2 — число измерений
print(a.dtype) # int64 — тип элементов
print(a.size) # 6 — всего элементов
Индексация: a[0, 1] — строка 0, столбец 1 (элемент 2). Срез a[1:, :2] — подматрица без копирования (view); для независимой копии — .copy().
Создание массивов
np.array([1, 2, 3]) # из списка
np.zeros((2, 3)) # нули
np.ones((3, 3)) # единицы
np.full((2, 2), 7) # константа 7
np.arange(0, 10, 2) # [0 2 4 6 8]
np.linspace(0, 1, 5) # 5 точек от 0 до 1 включительно
np.identity(4) # единичная 4×4
np.eye(3, k=1) # единицы на диагонали со сдвигом
Типы данных (dtype)
| dtype | Описание |
|---|---|
bool | True / False |
int8 … int64 | целые (размер 1–8 байт) |
float32, float64 | числа с плавающей точкой |
str_ | строки фиксированной длины в массиве |
x = np.array([1, 2, 3], dtype=np.float32)
y = x.astype(np.int64)
Полный список: np.sctypeDict. Для ML часто используют float32 (экономия памяти на GPU).
Линейная алгебра в NumPy
Связь с теорией: Векторы, Матрицы.
Операции над векторами
v1 = np.array([4, 1])
v2 = np.array([2, 5])
print(v1 + v2) # [6 6]
print(3 * v1) # [12 3]
print(v1 - v2) # [ 2 -4]
print(np.linalg.norm([6, 8])) # 10.0 — длина
print(v1 / np.linalg.norm(v1)) # нормализация
print(np.dot(v1, v2)) # 13 — скалярное произведение
print(np.outer(v1, v2)) # внешнее произведение → матрица
Операции над матрицами
A = np.array([[1, 2], [0, -1]])
B = np.array([[3, 0, -1], [2, 1, 4]])
C = A @ B # матричное умножение
print(-A) # или np.negative(A)
print(A + A)
print(2 * A)
print(A.T) # транспонирование
print(np.trace(A)) # сумма главной диагонали
Оператор @ (Python 3.5+) — то же, что np.matmul для 2D.
Broadcasting и агрегаты
Broadcasting — правила «растягивания» меньшего массива до размера большего без копирования в память:
M = np.ones((3, 4))
row = np.array([1, 2, 3, 4])
print(M + row) # row прибавляется к каждой строке
Агрегаты по оси: axis=0 — по столбцам, axis=1 — по строкам.
data = np.array([[1, 2], [3, 4], [5, 6]])
print(np.mean(data, axis=0)) # среднее по столбцам
print(np.sum(data, axis=1)) # сумма по строкам
Наиболее используемые функции
| Функция | Пример | Результат |
|---|---|---|
np.array() | np.array([1, 2, 3]) | [1 2 3] |
np.zeros() | np.zeros((2, 2)) | [[0. 0.] [0. 0.]] |
np.ones() | np.ones((2, 2)) | [[1. 1.] [1. 1.]] |
np.arange() | np.arange(1, 10, 2) | [1 3 5 7 9] |
np.linspace() | np.linspace(1, 5, 5) | [1. 2. 3. 4. 5.] |
np.reshape() | np.arange(4).reshape(2, 2) | [[0 1] [2 3]] |
np.transpose() / .T | A.T | строки ↔ столбцы |
np.random.rand() | np.random.rand(2, 2) | случайные [0, 1) |
np.sum() / np.mean() / np.std() | np.mean([1,2,3]) | 2.0 |
np.max() / np.min() | np.max([1, 5, 3]) | 5 |
np.dot() / @ | np.dot([1,2],[3,4]) | 11 |
np.linalg.norm() | np.linalg.norm([6,8]) | 10.0 |
np.outer() | np.outer([1,2],[3,4]) | матрица 2×2 |
np.eye() / np.identity() | np.eye(3) | единичная 3×3 |
Для воспроизводимости случайных чисел: np.random.seed(42).
prices = np.array([120, 95, 140, 88])
print(np.min(prices), np.mean(prices))
print(np.dot([1, 2], [3, 4])) # 11
Границы NumPy
NumPy — для однородных числовых массивов. Таблицы с колонками разных типов, метками строк и пропусками — Pandas. Глубокое обучение — TensorFlow/Keras или PyTorch, но CPU-режимы опираются на те же идеи массивов.
Маршрут: 342/343 (теория) → эта статья → Lab 1129 (практика) → 6-03/2 (перцептрон).