【问题标题】:Perform matrix multiplication with single column * single row用单列*单行执行矩阵乘法
【发布时间】:2021-12-29 15:56:47
【问题描述】:

如何阻止 python 假设我想要点积的标量结果?

我的列取自两个矩阵,分别是长度为 M 和 N 的 V=[v1,v2,v3,...] 和 D=[d1,d2,...]。 我需要下面的矩阵,可以通过一列一行的矩阵相乘生成。

v1d1, v1d2, v1*d3, ...

v2d1, v2d2,

v3*d1,

。 . .

这个计算至少会进行数十万次,所以我不想使用 for 循环。 当我尝试使用 numpy 执行此操作时,它假定我希望更常见的点积 (1xM, Nx1) 导致标量(如果 M=N)或错误,而不是我想要的 MxN 矩阵的 (Mx1, 1xN) .我试过 np.dot 和 np.matmul,在每种情况下它似乎都忽略了 np.transpose。

在下文中,我试图指定这些对象应被视为具有两个维度,并且无论是否存在转置,它都会给出相同的错误。

import numpy as np

v = np.arange(4)
d = np.arange(3)
np.reshape(v,(1,4))
np.reshape(d,(3,1))

e = np.matmul(np.transpose(d),v)
print(e)

Traceback(最近一次调用最后一次): 文件“/home/voidbender/research/NNs/test2.py”,第 8 行,在 e = np.matmul(np.transpose(v),d) ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 3 is different from 4)

【问题讨论】:

  • 因此,您需要 (3,1) 和 (1,4) 的矩阵乘积与常见尺寸 1 维上的乘积之和,以及 (3,4) 结果。 matmul 可以通过正确配对形状来做到这一点。 broadcasted 元素乘法也可以。 matmul docs 应该清楚维度是如何配对的。

标签: python numpy matrix


【解决方案1】:

您忘记将 v 和 d 重新分配给它的 reshape 版本,这可以完成工作:

import numpy as np

v = np.arange(4)
d = np.arange(3)
v =np.reshape(v,(1,4))
d =np.reshape(d,(3,1))

e=np.matmul(d,v)
print(e)

结果:

[[0 0 0 0]
 [0 1 2 3]
 [0 2 4 6]]

为了更简单,避免重塑,您可以通过以下方式创建列向量和行向量:

row_vector=np.array([np.arange(4)])
col_vector=np.array([np.arange(3)]).T

e=np.matmul(col_vector,row_vector)

【讨论】:

  • 就是这样!谢谢
  • 太好了,如果有用,请点赞!谢谢;)
猜你喜欢
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 2021-03-08
相关资源
最近更新 更多