Нашли ошибку?
продвинутыйNumPy 2.5.3

Линейная алгебра

Решить систему уравнений, найти обратную матрицу, определитель, собственные значения, норму и приближённое решение методом наименьших квадратов.

Нужно знать:Матричное умножение

Содержание статьи

Коротко

  • np.linalg.solve(A, b) решает систему A @ x = b. Это точнее и быстрее, чем inv(A) @ b.
  • inv — обратная матрица, det — определитель, matrix_rank — ранг.
  • eigh — собственные значения и векторы симметричной матрицы (вещественные, по возрастанию); eig — для любой квадратной.
  • norm — норма вектора или матрицы; с axis — для каждой строки или столбца.
  • lstsq(X, y) — приближённое решение переопределённой системы (линейная регрессия).
  • Вырожденная матрица даёт LinAlgError. Результаты — числа с плавающей точкой: сравнивайте через np.allclose.

Синтаксис

np.linalg.solve(A, b)
np.linalg.inv(A), np.linalg.det(A), np.linalg.matrix_rank(A)
values, vectors = np.linalg.eigh(A)     # симметричная A
values, vectors = np.linalg.eig(A)      # любая квадратная A
np.linalg.norm(x, ord=None, axis=None)
coef, residuals, rank, sv = np.linalg.lstsq(X, y)

Параметры

ПараметрЧто делаетПо умолчанию
ordвид нормы: None — евклидова, 1 — сумма модулей, np.inf — максимум модуляNone
axisв norm: считать норму вдоль оси (например, каждой строки)None
rcondв lstsq: порог отбрасывания малых сингулярных чиселпо машинной точности

Примеры

Данные для примеровиспользуются во всех примерах ниже
# 2 билета взрослых и 1 детский стоят 950, 1 взрослый и 3 детских — 1100
A = np.array([[2.0, 1.0],
              [1.0, 3.0]])
b = np.array([950.0, 1100.0])
M = np.array([[1.0, 2.0],
              [2.0, 4.0]])                 # вырожденная: вторая строка = первая × 2
Решить систему уравнений
np.linalg.solve(A, b).round(6)             # цены: взрослый и детский
Вывод
array([350., 250.])
Обратная матрица и определитель
print(np.linalg.inv(A).round(6))
np.linalg.det(A).round(6)
Вывод
[[ 0.6 -0.2]
 [-0.2  0.4]]
np.float64(5.0)
solve вместо inv
x1 = np.linalg.solve(A, b)
x2 = np.linalg.inv(A) @ b                  # работает, но медленнее и менее точно
np.allclose(x1, x2)
Вывод
True
Нормы
v = np.array([3.0, 4.0])
print(np.linalg.norm(v))                   # длина вектора
print(np.linalg.norm(v, ord=1))            # сумма модулей
np.linalg.norm(A, axis=1).round(6)         # длина каждой строки
Вывод
5.0
7.0
array([2.236068, 3.162278])
Собственные значения симметричной матрицы
values, vectors = np.linalg.eigh(A)        # для симметричных матриц
values.round(6)
Вывод
array([1.381966, 3.618034])
Метод наименьших квадратов
hours = np.array([1.0, 2.0, 3.0, 4.0])
score = np.array([52.0, 55.0, 61.0, 64.0])
X = np.column_stack([np.ones(4), hours])   # столбец единиц — свободный член
coef, *_ = np.linalg.lstsq(X, score)
coef.round(6)                              # score ≈ coef[0] + coef[1] * hours
Вывод
array([47.5,  4.2])

Подводные камни

eig всегда возвращает комплексные числа

eig для симметричной матрицы
values, vectors = np.linalg.eig(A)         # общий случай: порядок значений не гарантирован
np.sort(values).round(6)                   # с NumPy 2.5 всегда комплексные
Вывод
array([1.381966+0.j, 3.618034+0.j])

Вырожденная матрица

Если строки линейно зависимы (ранг меньше размера), решения нет или их бесконечно много.

Ранг вырожденной матрицы
np.linalg.matrix_rank(M)
Вывод
np.int64(1)
solve для вырожденной матрицыошибка: LinAlgError
np.linalg.solve(M, b)
Ошибка
LinAlgError: Singular matrix

Для таких систем используйте lstsq — он вернёт решение с наименьшей ошибкой.