【发布时间】: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元素乘法也可以。matmuldocs 应该清楚维度是如何配对的。