numpy.linalg.inv

numpy.linalg.inv(a)

Функция linalg.inv() вычисляет обратную матрицу.

Для квадратной матрицы \(A\), обратной является такая матрица \(A^{-1}\), для которой выполняется условие:

$$AA^{-1}=A^{-1}A=E$$

В случае если входная матрица a не является квадратной или вычисление обратной матрицы невозможно, то вызывается исключение LinAlgError.

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


Примеры

>>> import numpy as np
>>> from numpy import linalg as LA
>>> 
>>> a = np.random.randint(10, size = (6, 6))
>>> a
array([[8, 9, 7, 6, 3, 0],
       [6, 3, 1, 9, 8, 1],
       [9, 5, 9, 7, 3, 6],
       [9, 1, 3, 2, 4, 9],
       [1, 5, 8, 4, 0, 0],
       [9, 2, 0, 4, 7, 5]])
>>> 
>>> a_inv = LA.inv(a)
>>> a_inv
array([[-0.14883721, -0.39186047,  0.53837209, -0.69069767, -0.16744186,  0.6755814 ],
       [ 0.53333333,  0.55      , -0.78333333,  1.1       , -0.06666667,  -1.15     ],
       [-0.41627907, -0.51395349,  0.4627907 , -0.83023256,  0.34418605,  1.04186047],
       [ 0.20310078,  0.43837209, -0.08100775,  0.45813953, -0.31317829, -0.81511628],
       [-0.30465116, -0.28255814, -0.00348837, -0.4372093 ,  0.46976744,  0.84767442],
       [ 0.31860465,  0.53023256, -0.58604651,  1.04883721, -0.07906977, -1.09069767]])
>>> 
>>> 
>>> np.dot(a, a_inv)
array([[ 1.00000000e+00, -1.11022302e-16, -9.85322934e-16, -4.44089210e-16,  2.22044605e-16,  4.44089210e-16],
       [-5.55111512e-17,  1.00000000e+00,  3.33066907e-16, -1.77635684e-15,  0.00000000e+00,  1.99840144e-15],
       [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00, -8.88178420e-16,  0.00000000e+00,  0.00000000e+00],
       [ 0.00000000e+00, -8.88178420e-16,  8.88178420e-16,  1.00000000e+00,  0.00000000e+00,  1.77635684e-15],
       [-3.33066907e-16,  6.66133815e-16, -9.99200722e-16,  1.33226763e-15,  1.00000000e+00, -2.22044605e-15],
       [ 2.22044605e-16, -4.44089210e-16, -4.44089210e-16, -1.77635684e-15,  4.44089210e-16,  1.00000000e+00]])

Мы можем проверить правильность результата, опираясь на основное свойство обратной матрицы, т.е. np.dot(a, ainv) = np.dot(ainv, a) = np.eye(a.shape[0])

>>> np.allclose(np.dot(a, a_inv), np.eye(a.shape[0]))
True
>>> 
>>> np.allclose(np.dot(a_inv, a), np.eye(a.shape[0]))
True

Понятие обратной матрицы может быть обобщено и для матриц над полем комплексных чисел:

>>> b = np.random.randint(0, 10, size = (4, 4))
>>> c = np.random.randint(0, 10, size = (4, 4))
>>> 
>>> z = b + c*1j
>>> z
array([[7.+0.j, 7.+4.j, 6.+1.j, 9.+9.j],
       [2.+6.j, 4.+8.j, 5.+8.j, 8.+4.j],
       [7.+1.j, 7.+4.j, 1.+6.j, 5.+5.j],
       [9.+1.j, 8.+6.j, 4.+4.j, 6.+8.j]])
>>> 
>>> z_inv = LA.inv(z)
>>> z_inv
array([[ 0.04248703-0.30126338j, -0.13290916+0.01529899j,  0.07682157-0.35652787j,  0.08277916+0.57908833j],
       [-0.04071282+0.36279118j,  0.07957304-0.10205249j,  0.08653401+0.46482539j, -0.14389804-0.66769836j],
       [-0.01060869+0.0444729j ,  0.04056649-0.01735018j, -0.1520231 -0.11146967j,  0.09741184+0.03498778j],
       [ 0.11237768-0.17060791j,  0.0031617 +0.03600685j,  0.06850577-0.09999216j, -0.10577338+0.20449824j]])
>>> 
>>> np.allclose(np.dot(z, z_inv), np.eye(z.shape[0]))
True
>>> 
>>> np.allclose(np.dot(z_inv, z), np.eye(z.shape[0]))
True