4

Я получаю две 3d матрицы A (32x3x3) и B (32x3x3), и я хочу получить матрицу C с размером 32x3x3. Расчет может быть выполнен с использованием петли типа:numpy многомерное умножение матрицы (3d)

a = numpy.random.rand(32, 3, 3) 
b = numpy.random.rand(32, 3, 3) 
c = numpy.random.rand(32, 3, 3) 

for i in range(32): 
    c[i] = numpy.dot(a[i], b[i]) 

Я считаю, что для решения этой проблемы должно быть более эффективное однострочное решение. Может кто-нибудь помочь, спасибо.

+2

Вы имеете в виду элементное умножение или умножение матрицы на * слои *? – AlvaroP

+0

Почему downvote? Вопрос разумный и ясный, ИМО. – heltonbiker

+0

@AlvaroP, поскольку OP использует 'dot', похоже, что умножение на слои - это намерение. Я считаю, что некоторые умные изменения/умножение/изменение формы могут достичь желаемого результата, но не настолько уверенны. – heltonbiker

ответ

3

Вы могли бы сделать это с помощью np.einsum:

In [142]: old = orig(a,b) 

In [143]: new = np.einsum('ijk,ikl->ijl', a, b) 

In [144]: np.allclose(old, new) 
Out[144]: True 

Одно из преимуществ использования einsum является то, что вы можете почти прочитать от того, что он делает из индексов: оставить первую ось в одиночку (i), и выполнить матрицу умножение на последние два (jk,kl->jl)).

Смежные вопросы