【问题标题】:Taking the dot product of two arrays in python without for loops在没有for循环的python中取两个数组的点积
【发布时间】:2019-01-25 05:21:02
【问题描述】:

我有两个数组 WxW 的形状为 (16, 10)x 的形状为 (10000, 16)。我需要在Wx 的转置之间取点积。问题是xW 的形状非常不同,所以我在尝试执行此操作时不断出错。当然我可以使用for 循环来做到这一点,但我想在不使用任何for 循环的情况下做到这一点。

for i in range(x.shape[0])
    s = (np.dot(W.transpose(), x[i])) + b

上面的代码生成了一个数组s,它由10 个条目组成。我试图让s 成为 10,000 行,每行有 10 个条目(不使用for 循环)。

【问题讨论】:

  • 因为 W.shape 是 (16,10) 而 x.shape 是 (10000,16)。点积可以在 np.dot(x , W) 之间完成。输出形状将是 (10000,10)
  • 所以你是说我不需要对 W 使用转置?
  • 是的。根据您的输出要求,看起来这就是您正在查看的操作。

标签: python arrays numpy for-loop


【解决方案1】:

你可能正在寻找

s = x.dot(W)

或者

s = x @ W

dot 表现为简单一维向量的 for 乘积,否则为成熟的矩阵乘法。由于您需要 (10000, 10) 结果形状,因此您需要设置矩阵以在外部维度中具有该形状,并匹配内部维度:

(10000, 16) x (16, 10) -> (10000, 10)

要按您想要的任何顺序执行求和,您可以使用np.einsum

s= np.einsum('ik,ji->jk', W, x)

或者干脆

s = np.einsum('ik,ji', W, x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2020-02-24
    相关资源
    最近更新 更多