numpy.linalg.tensorinv
numpy.linalg.tensorinv(a, ind=2)
Функция 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]
.
Примеры
>>> 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