如何用新维度中的串联替换numpy矩阵乘法中的求和?
对于结果矩阵中的每个位置,我不想在参数矩阵中存储相应行和列的点积,而是想存储元素级积,它将是一个扩展到三维的向量 一个想法是将参数矩阵转换为带有向量项的向量,然后取它们的外积,但我也不知道如何做到这一点 编辑: 在我看到答复之前,我就明白了。以下是我的解决方案:如何用新维度中的串联替换numpy矩阵乘法中的求和?,numpy,3d,concatenation,matrix-multiplication,operation,Numpy,3d,Concatenation,Matrix Multiplication,Operation,对于结果矩阵中的每个位置,我不想在参数矩阵中存储相应行和列的点积,而是想存储元素级积,它将是一个扩展到三维的向量 一个想法是将参数矩阵转换为带有向量项的向量,然后取它们的外积,但我也不知道如何做到这一点 编辑: 在我看到答复之前,我就明白了。以下是我的解决方案: def newdot(A, B): A = A.reshape((1,) + A.shape) B = B.reshape((1,) + B.shape) A = A.transpose(2, 1, 0) B = B.
def newdot(A, B):
A = A.reshape((1,) + A.shape)
B = B.reshape((1,) + B.shape)
A = A.transpose(2, 1, 0)
B = B.transpose(1, 0, 2)
return A * B
我所做的是将每一行和每一列对分开,并将它们的外积取下来,形成两个列表,然后将它们的内容矩阵并行相乘。这有点复杂(很难解释),但这个函数应该可以让您找到您想要的:
def f(m1, m2):
return (m2.A.T * m1.A.reshape(m1.shape[0],1,m1.shape[1]))
m3 = m1 * m2
m3_el = f(m1, m2)
m3[i,j] == sum(m3_el[i,j,:])
m3 == m3_el.sum(2)
其基本思想是将矩阵转换为数组,并逐元素进行乘法。其中一个数组被重新整形,使其中间维度的大小为一,而数组广播规则将此维度扩展以匹配另一个数组的高度。您可以用
m1.a[:,None,:]
替换您的重新整形,这使它更紧凑,而且(我认为)更可读。