numpy中3维矩阵的乘法

LWZ*_*LWZ 5 python numpy matrix matrix-multiplication

我想昨天我问错了问题。我真正想要的是将两个2x2xN矩阵加AB,这样

C[:,:,i] = dot(A[:,:,i], B[:,:,i])
Run Code Online (Sandbox Code Playgroud)

例如,如果我有一个矩阵

A = np.arange(12).reshape(2, 2, 3)
Run Code Online (Sandbox Code Playgroud)

如何获得C = A x A上述定义?有内置的功能可以做到这一点吗?


另外,如果我乘A (shape 2x2xN)B (shape 2x2x1, instead of N),我想

C[:,:,i] = dot(A[:,:,i], B[:,:,1])
Run Code Online (Sandbox Code Playgroud)

Bi *_*ico 5

尝试使用numpy.einsum,它有一点学习曲线,但它应该给你你想要的。这是一个帮助您入门的示例。

import numpy as np

A = np.random.random((2, 2, 3))
B = np.random.random((2, 2, 3))

C1 = np.empty((2, 2, 3))
for i in range(3):
    C1[:, :, i] = np.dot(A[:, :, i], B[:, :, i])

C2 = np.einsum('ijn,jkn->ikn', A, B)
np.allclose(C1, C2)
Run Code Online (Sandbox Code Playgroud)

  • +1 我第一次看到 `einsum` 使用时,它有[“与魔法无法区分”](http://en.wikipedia.org/wiki/Clarke's_ Three_laws)的味道,强大的功能,而且超快。 (2认同)
  • 当最后一个维度不同时它起作用的原因是因为 numpy 广播,http://www.scipy.org/EricsBroadcastingDoc,数组具有兼容的形状。以下是当最后一个维度为 3 和 4 时收到的错误消息: `ValueError: operands Could not be Broadcast一起与重新映射的形状 [original->remapped]: (2,2,3)->(2,newaxis,3 ,2) (2,2,4)->(2,4,2)`。 (2认同)