Коротко
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 — максимум модуляNoneaxisв norm: считать норму вдоль оси (например, каждой строки)Nonercondв 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]]) # вырожденная: вторая строка = первая × 2np.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)
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 всегда возвращает комплексные числа
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)
np.linalg.solve(M, b)Ошибка
LinAlgError: Singular matrix
Для таких систем используйте lstsq — он вернёт решение с наименьшей ошибкой.