Перейти к основному содержимому

NumPy — массивы, векторы и матрицы

Разработчику

NumPy (Numerical Python) — стандарт для быстрых численных вычислений в Python. Главный тип — ndarray (n-мерный массив): однородные числа в непрерывном блоке памяти, операции векторизуются без Python-циклов.

Теория векторов и матриц — 342, 343. Пошаговые скрипты с разбором строк — Lab 1129. Pandas и визуализация — 33 — анализ данных.


NumPy vs список Python

listndarray
Элементыссылки на объекты разных типовзначения одного 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Описание
boolTrue / False
int8int64целые (размер 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() / .TA.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 (перцептрон).