numpy.linalg.eig

numpy.linalg.eig(a)

Функция numpy.linalg.eig() вычисляет собственные числа (значения) и собственные векторы квадратной матрицы.

Собственное число квадратной матрицы a и ее собственный вектор связаны равенством np.dot(a, v) = w*v.

Если у матрицы несколько собственных чисел и соответственно несколько собственных векторов, то данная функция возвращает массив собственных значений и массив собственных векторов (необязательно упорядоченных). В этом случае выполняются равенства np.dot(a[:,:], v[:,i]) = w[i] * v[:,i], для всех i из интервала [0, ..., M - 1], где M - размер матрицы.

Параметры:
a - массив NumPy или подобнй массиву объект.
Это может быть толко "квадратный" двумерный массив, т.е. квадратная матрица. Если это многомерный массив, то две его последние оси должны быть равны, в этом случае он рассматривается как массив матриц и все вычисления выполняются отдельно для каждой из них.
Возвращает:
w - массив NumPy
Собственные числа входной матрицы.
v - массив NumPy
Собственные векторы входной матрицы.

Замечание

Смотрите так же:
eigh, eigvals, eigvalsh

Примеры

>>> import numpy as np
>>> from numpy import linalg as LA
>>> 
>>> a = np.array([[2, 3, 5], [7, 11, 13], [17, 19, 23]])
>>> w,v = LA.eig(a)
>>> w
array([36.81172799, -1.91702763,  1.10529963])
>>> v
array([[-0.16510917, -0.60574007,  0.36952037],
       [-0.4789958 , -0.3769456 , -0.8244886 ],
       [-0.86214963,  0.70070748,  0.42857116]])
>>> np.dot(a,v)
array([[ -6.07795389,   1.16122046,   0.40843073],
       [-17.6326632 ,   0.72261513,  -0.91130695],
       [-31.73721763,  -1.3432756 ,   0.47369955]])
>>> 
>>> w*v
array([[ -6.07795389,   1.16122046,   0.40843073],
       [-17.6326632 ,   0.72261513,  -0.91130695],
       [-31.73721763,  -1.3432756 ,   0.47369955]])

Иногда, визуально кажется, что вышеописанные равенства не выполняются:

>>> a = np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])
>>>
>>> w,v = LA.eig(a)
>>> np.dot(a,v)
array([[ 1.60356745e+00,  1.11022302e-16,  0.00000000e+00],
       [ 3.20713490e+00,  2.22044605e-16,  0.00000000e+00],
       [ 4.81070235e+00,  0.00000000e+00, -2.22044605e-16]])
>>> w*v
array([[ 1.60356745e+00, -4.10074414e-16, -3.96241817e-17],
       [ 3.20713490e+00, -1.03002928e-16,  1.46033608e-16],
       [ 4.81070235e+00,  5.13077342e-16, -1.06409427e-16]])

Однако, значения первых столбцов равны, а значения второго и третьего столбцов настолько малы, что могут быть приравнены к 0.

Всегда следует помнить об ошибках округления:

>>> a = np.array([[1 + 1e-9, 0], [0, 1 - 1e-9]])
>>>
>>> w,v = LA.eig(a)
>>>
>>> w
array([1., 1.])
>>>
>>> v
array([[1., 0.],
       [0., 1.]])

Но на самом деле w = [1.000000001, 0.999999999].