【问题标题】:Matrix splitting and multiplication in pythonpython中的矩阵拆分和乘法
【发布时间】:2018-11-22 09:52:44
【问题描述】:

我有这 2 个矩阵:第一个 [P,1] 和第二个 [N*P,2],在 Python 中。

我想将第一个乘以第二个的 [P,2] 子矩阵 N 次(没有 for 循环)。

我给你举个例子:

a=[1,2,3]
b=[[1,2],[3,4],[5,6],[7,8],[9,10],[11,12]]

所以,在这种情况下,P=3 N=2。结果应该是一个矩阵[N,2]。在示例中:

res=[[22,28],[58,64]]

我已尝试使用 reshape(P,N*2),但我不认为它值得。 有什么建议吗?

【问题讨论】:

  • 当我说“乘”表示“标量积”(np.dot)时,对于第一个矩阵到第二个的每个 N 子矩阵。

标签: python algorithm matrix-multiplication


【解决方案1】:

根据你的订单,你想要的是

np.sum(a[None,:,None]*b.reshape(2,3,2), axis=1)

您需要在中间空间中重新转置数据,因为它们没有像我们预期的那样交错。

【讨论】:

  • 那个“axes=(2,0, 1)”有什么用?
  • 这是根据需要转置b,交换最后两个轴。 b 的形状是2,3,2,你需要将 3 作为形状中的最后一个元素才能进行乘法运算。其实,让我试试别的吧。
  • @GiorgioCesaritti 不需要转置,只需根据需要更改 a、b 的形状,相乘和求和 ;)
  • 我不知道为什么,但它不起作用。你看到我关于“标量积”的最后评论了吗?也许值得……
  • 它不起作用是什么意思?如果我使用你的 a,b,我会得到你指定的结果。是的,我理解,这就是为什么在我们想要你的点积的轴上的积总和。由于广播,我们不能使用 tensordot。
【解决方案2】:

在列表推导和最终垂直堆栈中计算每个子矩阵的方法

import numpy
a = numpy.array([1, 2, 3])
b = numpy.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]])
c = numpy.vstack([numpy.dot(a, b[x * a.shape[0]:(x + 1) * a.shape[0], :])
                  for x in range(int(b.shape[0] / a.shape[0]))])
print(c)

【讨论】:

  • 对不起,我不能用于循环
  • 即使这里的for循环不用于矩阵乘法?
  • 我不能在整个项目中使用循环
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多