numpy.linalg.inv
numpy.linalg.inv(a)
Функция linalg.inv() вычисляет обратную матрицу.
Для квадратной матрицы \(A\), обратной является такая матрица \(A^{-1}\), для которой выполняется условие:
$$AA^{-1}=A^{-1}A=E$$
В случае если входная матрица a не является квадратной или вычисление обратной матрицы невозможно, то вызывается исключение LinAlgError.
-
- a - массив NumPy или подобнй массиву объект.
- Это может быть толко "квадратный" двумерный массив, т.е. квадратная матрица. Если это многомерный массив, то две его последние оси должны быть равны, в этом случае он рассматривается как массив матриц и обратная матрица вычисляется отдельно для каждой из них.
-
- результат - массив NumPy
- Обратная матрица или массив обратных матриц.
Примеры
>>> 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