Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用新维度中的串联替换numpy矩阵乘法中的求和?_Numpy_3d_Concatenation_Matrix Multiplication_Operation - Fatal编程技术网

如何用新维度中的串联替换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,:]
替换您的重新整形,这使它更紧凑,而且(我认为)更可读。