【问题标题】:Multiplication between arrays of different shape in numpynumpy中不同形状的数组之间的乘法
【发布时间】:2020-02-10 10:36:30
【问题描述】:

我是 Python 新手,我不知道如何在不同形状的数组之间执行乘法运算。 我有两个不同的数组 wb 这样:

W.shape = [32, 5, 20]
b.shape = [5,]

我想乘数

W[:, i, :]*b[i]

对于从 0 到 4 的每个 i。 我怎样才能做到这一点?提前致谢。

【问题讨论】:

  • 预期输出是什么?
  • @MihaiAlexandru-Ionut 一个形状为 [32,5,20] 的数组
  • @MaurizioSerra 什么?预期的输出是[32,5,20]?那为什么不自己返回W呢?
  • @Ch3steR 因为我需要在我的代码中将W[:, i, :] 乘以b[i]...

标签: python arrays numpy vector multiplication


【解决方案1】:

您可以向b 添加一个新轴,使其与W 的内部数组行相乘,即第二个轴:

W * b[:,None]

【讨论】:

    【解决方案2】:

    你想做的事叫做Broadcasting。在 numpy 中,您可以通过这种方式相乘,但前提是形状根据某些限制匹配:

    从右开始,每个数组的每个元素shape必须相等,1,否则不存在

    所以现在你有:

    W.shape = (32, 5, 20)
    b.shape =        (5,)
    

    由于 20 和 5 不匹配,因此无法广播。

    如果你有:

    W.shape = (32, 5, 20)
    b.shape =     (5, 1 )
    

    20 将与 1 匹配(1 始终可以)并且 5 将匹配,然后您可以将它们相乘。

    要将b 的形状变为(5, 1),您可以使用.reshape(5, 1)(或者,更可靠的是.reshape(-1, 1))或使用[:, None] 进行花式索引

    因此,这些工作中的任何一个都有效:

    W * b[:,None] #yatu's answer
    W * b.reshape(-1, 1)
    

    【讨论】:

      猜你喜欢
      • 2018-12-23
      • 2016-11-20
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多