numpy.linalg.tensorinv

numpy.linalg.tensorinv(a, ind=2)

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

Параметры:
a - массив NumPy или подобнй массиву объект.
"Квадратный" тезор, т.е. такой тензор, форма которого должна удовлетворять следующим условиям: np.prod(a.shape[:ind]) == np.prod(a.shape[ind:]). Если a является "вырожденным" или не является "квадратным" то возвращается ошибка LinAlgError.
a - положительное целое число (необязательный параметр).
Количество первых индексов в a.shape, участвующих в обратном суммировании.
Возвращает:
результат - массив NumPy или число
Обратный тензор с формой a.shape[ind:] + a.shape[:ind].
Смотрите так же:
linalg.inv, linalg.pinv

Примеры

>>> import numpy as np
>>> from numpy import linalg as LA
>>> 
>>> a = np.random.randint(0, 10, size = (2, 3, 2, 3))
>>> a
array([[[[3, 1, 2],
         [0, 5, 7]],

        [[8, 0, 5],
         [2, 2, 7]],

        [[9, 3, 7],
         [3, 5, 2]]],


       [[[3, 7, 1],
         [6, 1, 6]],

        [[9, 9, 1],
         [8, 1, 0]],

        [[6, 9, 0],
         [0, 9, 9]]]])
>>> 
>>> a_tinv = LA.tensorinv(a)
>>> a_tinv
array([[[[-3.35570470e-02,  1.34228188e-01, -8.05369128e-02],
         [-1.47651007e-01,  1.07382550e-01,  3.80313199e-02]],

        [[-3.98098434e-01,  4.23937360e-02,  8.45637584e-02],
         [ 1.38366890e-01, -1.46085011e-01,  1.65622670e-01]],

        [[-2.91610738e-01,  1.64429530e-02,  2.20134228e-01],
         [ 1.86912752e-01, -2.26845638e-01,  4.04921700e-02]]],


       [[[ 4.68232662e-01, -1.72930649e-01, -3.62416107e-02],
         [ 2.23713647e-04,  1.81655481e-01, -2.21774795e-01]],

        [[ 4.30648770e-01, -2.22595078e-01,  3.35570470e-02],
         [-1.05145414e-01,  1.21923937e-01, -9.91797166e-02]],

        [[-1.01789709e-02,  9.07158837e-02, -6.44295302e-02],
         [ 6.52125280e-02, -4.74272931e-02,  1.93139448e-02]]]])
>>> 
>>> a_tinv.shape
(2, 3, 2, 3)
>>> 
>>> 
>>> np.rint(np.tensordot(a, a_tinv))    #  Результат округляется до ближайшего целого числа
array([[[[ 1.,  0., -0.],
         [-0.,  0., -0.]],

        [[ 0.,  1., -0.],
         [ 0.,  0., -0.]],

        [[ 0., -0.,  1.],
         [-0., -0., -0.]]],


       [[[ 0.,  0.,  0.],
         [ 1.,  0., -0.]],

        [[ 0.,  0.,  0.],
         [ 0.,  1., -0.]],

        [[-0.,  0.,  0.],
         [ 0.,  0.,  1.]]]])

Количество индексов (осей) не обязательно должно быть четным числом:

>>> b = np.random.randint(0, 10, size = (2, 2, 3, 4, 3))
>>> b_tinv = LA.tensorinv(b, ind = 3)
>>> 
>>> b_tinv.shape
(4, 3, 2, 2, 3)
>>> 
>>> 
>>> e = np.eye(12)
>>> e.resize((4, 3, 4, 3))
>>> 
>>> np.allclose(np.tensordot(b_tinv, b, 3), e)
True