Умножение матрицы на двумерные элементы

1

У меня 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.

Благодарю.

  • 1
    @ делает матричное умножение на последние 2 измерения. так что вам придется транспонировать оси.
  • 0
    Это также работает, спасибо
Теги:
numpy
matrix-multiplication

1 ответ

1
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню