我试图从这个矩阵乘法中删除循环(并了解更多关于优化代码的一般知识),我想我需要某种形式的np.broadcasting
或{
A = np.array([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11,12,13,14,15]])
#A is a 3x5 matrix, such that the shape of A is (3, 5) (and A[0] is (5,))
B = np.array([[1,0,0],
[0,2,0],
[0,0,3]])
#B is a 3x3 (diagonal) matrix, with a shape of (3, 3)
C = np.zeros(5)
for i in range(5):
C[i] = np.linalg.multi_dot([A[:,i].T, B, A[:,i]])
#Each row of matrix math is [1x3]*[3x3]*[3x1] to become a scaler value in each row
#C becomes a [5x1] matrix with a shape of (5,)
我知道我不能只做np.multidot
,因为这会产生一个(5,5)数组。在
我也发现了这个问题:Multiply matrix by each row of another matrix in Numpy,但我不知道这是否真的是我的问题。在
您可以将对
dot
的调用链接在一起,然后得到对角线:或者等效地,使用原始的
^{pr2}$multi_dot
思路,但取结果为5x5数组的对角线。这可能会提高性能(根据docs)这是}是用于乘积和的指数。在
^{pr2}$einsum
的自然现象。我像您一样使用i
来表示传递到结果的索引。j
和{它可能也可以用
mutmul
来完成,尽管它可能需要添加一个维度和后一个压缩。在使用
dot
的方法所做的工作比必要的多得多。diag
抛出了很多值。在要使用
matmul
,我们必须使i
维成为3d数组中的第一个。这是“被动”的结果:或者索引掉额外的维度:
(A.T[:,None,:]@B@A.T[:,:,None])[:,0,0]
阿托补充答案。如果你想使矩阵相乘,你可以利用广播。编辑:请注意,这是元素乘法,不是点积。为此,您可以使用点方法。在
给出:
^{pr2}$相关问题 更多 >
编程相关推荐