我碰到了一个代码,该代码执行列表'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)
都不起作用。
答案 0 :(得分:1)
通常,由于A
和B
的形状不同,因此此操作永远不会起作用。
然而,np.dot(B, A)
起作用的原因是因为np.dot
是vectorized。因此,实际上发生的是B的所有三个索引(np.dot
,B[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)与(6,)也可以。
但是(6,)失败并显示(3,6)(第2个6放置在错误的位置)。
matmul
的作用相同,但讨论的是添加1号临时尺寸。