Умножение матрицы на двумерные элементы - PullRequest
0 голосов
/ 30 августа 2018

У меня есть матрица a numpy ndarray 3x3, которая выглядит следующим образом

a =  ([[ uu, uv, uw],
       [ uv, vv, vw],
       [ uw, vw, ww]])

Каждый компонент сам по себе является двумерным массивом размером (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 (тусклый 3)! = 1218 (тусклый 2)

Я хочу иметь возможность выполнять эту операцию, как если бы элементы a, где просто скалярные значения, где a@a не выдает ошибку, связанную с его формами, поскольку это простое умножение матрицы 3x3.

Спасибо.

1 Ответ

0 голосов
/ 30 августа 2018

Предполагая, что вы хотите выполнить матричное умножение для каждого элемента по двум последним осям, мы можем использовать 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]])
...