将数组与点乘积相乘

时间:2020-06-14 04:09:06

标签: python python-3.x numpy

我碰到了一个代码,该代码执行列表'A'的一般点积和numpy数组'B'。

A = [1,2,3,4,5,6]
B = np.arange(18).reshape(3, len(A))

result = np.dot (B,A)
result2 = np.dot (A,B)

np.dot(A,B)给出错误:“值错误:形状(6,)和(3,6)不对齐:6(dim 0)!= 3(dim 0)”

但是,np.dot (B,A)给出结果[70 196 322]。

您能帮助我理解为什么np.dot(B,A)有效但np.dot(A,B)无效的原因吗?

理想情况下,我希望仅当第一个矩阵的COLUMNS数与第二个矩阵的ROWS数相同时,点积才能工作。 B具有3行6列,A具有1行6列。因此,我希望np.dot(B,A)np.dot(A,B)都不起作用。

2 个答案:

答案 0 :(得分:1)

通常,由于AB的形状不同,因此此操作永远不会起作用。

然而,np.dot(B, A)起作用的原因是因为np.dotvectorized。因此,实际上发生的是B的所有三个索引(np.dotB[0]B[1])和B[2]都被调用A[70 196 322]的返回值是所有三个np.dot调用的结果,并合并为一个数组。

np.dot(A, B)给出错误的原因是,对索引为np.dot(例如,A)的np.dot(A[0], B)的调用仍然具有无效的形状。 / p>

答案 1 :(得分:1)

np.dot(A, B)的基本规则是将A的最后一个轴与B的最后一个轴相匹配。在einsum表示法中,这是'ij,jk-> ik',在共享'j'。

但是dot对于1d情况有明确的规则。

(6,)与(6,)产生标量(向量内部“点”积,a.b

具有(6,3)的

(6,)产生(3,)(共享6)。

(3,6)与(6,)也可以。

但是(6,)失败并显示(3,6)(第2个6放置在错误的位置)。

matmul的作用相同,但讨论的是添加1号临时尺寸。