【问题标题】:Multiplying list with array as dot product将数组乘以列表作为点积
【发布时间】:2020-06-14 04:09:06
【问题描述】:

我遇到了一个代码,它执行列表“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) 无效吗?

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

【问题讨论】:

  • 它的行为符合您的预期,对吧?这里有什么问题?
  • B 有 3 行 6 列,A 有 1 行 6 列。由于 B 的列数不等于 A 中的行数,我希望 np.dot(B,A) 不起作用。
  • numpy 中 N 大小的一维数组不是大小为 1xN 的矩阵。您应该查看文档,了解当第二个参数是一维数组时 np.dot 的行为方式:numpy.org/doc/stable/reference/generated/numpy.dot.html
  • 您阅读文档了吗?他们怎么说一维数组?

标签: python python-3.x numpy


【解决方案1】:

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

但是,np.dot(B, A) 起作用的原因是因为np.dotvectorized。所以真正发生的是np.dot 被B 的所有三个索引(B[0]B[1]B[2])和A 调用。 [70 196 322] 的返回值是所有三个np.dot 调用的结果,合并为一个数组。

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

【讨论】:

    【解决方案2】:

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

    但是dot 对一维情况有明确的规则。

    (6,) 和 (6,) 产生一个标量(向量内“点”积,a.b

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

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

    但是 (6,) 以 (3,6) 失败(第 2 个 6 在错误的位置)。

    matmul 做同样的事情,但谈到添加临时尺寸 1 尺寸。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2018-04-12
      • 1970-01-01
      相关资源
      最近更新 更多