У меня a
Numpy ndarray
матрица 3х3, которая выглядит следующим образом
a = ([[ uu, uv, uw],
[ uv, vv, vw],
[ uw, vw, ww]])
Каждый компонент сам по себе является 2D массив размера (N,M)
, так что матрица имеет a
(3,3,N,M)
форму.
Как я мог выполнить матричное умножение a*a
на питоновском? Используя a@a
выдается следующая ошибка (для N = 1218 и M = 540):
ValueError: фигуры (3,3,1218,540) и (3,3,1218,540) не выровнены: 540 (dim 3)! = 1218 (dim 2)
Я хочу, чтобы иметь возможность выполнять эту операцию, как если бы элементы a
где только скалярные значения, где a@a
не выдает ошибку, связанную с ее фигурами, поскольку это простое матричное умножение 3x3.
Благодарю.
Предполагая, что вы хотите выполнить матричное умножение для каждого элемента вдоль двух последних осей, мы можем использовать np.einsum
-
np.einsum('ijkl,jmkl->imkl',a,a)
Пример прогона для проверки -
In [43]: np.random.seed(0)
In [44]: a = np.random.rand(3,3,4,5)
In [45]: a[:,:,0,0].dot(a[:,:,0,0])
Out[45]:
array([[0.71750146, 1.17057872, 1.11135764],
[0.62938365, 0.86437796, 0.74541383],
[1.04636618, 1.62011127, 1.35483565]])
In [46]: np.einsum('ijkl,jmkl->imkl',a,a)[:,:,0,0]
Out[46]:
array([[0.71750146, 1.17057872, 1.11135764],
[0.62938365, 0.86437796, 0.74541383],
[1.04636618, 1.62011127, 1.35483565]])