如何将numpy矩阵乘法中的求和替换为在新维度上的连接?

3

针对结果矩阵中的每个位置,我希望存储相应行和列在参数矩阵中的元素乘积,这将形成一个向第三维度延伸的向量,而不是储存它们的点积。

一种思路是将参数矩阵转换为带有向量条目的向量,然后取它们的外积,但我也不确定如何做。

编辑:

在看到答复之前,我已经想出了解决方案:

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

我正在做的是将需要进行外积计算的每一行和列对分解,并形成两个列表,然后并行地将它们的内容矩阵相乘。
1个回答

3

这个函数可能有点复杂(而且难以解释),但是它可以帮助您找到您要查找的内容:

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)

基本思路是将矩阵转换为数组,进行逐元素乘法。其中一个数组被重新形状为其中间维度大小为一的数组,并且数组广播规则会扩展此维度以匹配另一个数组的高度。

1
你可以使用 m1.A[:, None, :] 替换你的 reshape,这样更加简洁和易读(我认为)。 - Jaime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接