【问题标题】:Numpy BroadcastingNumpy 广播
【发布时间】:2017-02-17 17:45:03
【问题描述】:

当我在 Numpy 中进行此操作时会发生什么?

a = np.ones([500,1])
b = np.ones([5000,])/2
c = a + b 

# a.shape (500,1)
# b.shape (5000, )
# c.shape (500, 5000)

我很难弄清楚这次广播中到底发生了什么。

【问题讨论】:

  • 你浏览过关于广播的文档吗?
  • 这里有点棘手的是,按照惯例,如果像 b 那样缺少轴,它们将作为轴添加到 left。我不知道这是否有更深层次的原因,不过它确实保留了 C 连续性。

标签: python numpy broadcasting array-broadcasting


【解决方案1】:

Numpy 假设为一维数组行向量,因此您的求和确实在形状 (500, 1) 和 (1, 5000) 之间,这会导致矩阵求和。

由于这不是很清楚,您应该明确扩展您的尺寸:

>>> np.arange(5)[:, None] + np.arange(8)[None, :]
array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [ 1,  2,  3,  4,  5,  6,  7,  8],
       [ 2,  3,  4,  5,  6,  7,  8,  9],
       [ 3,  4,  5,  6,  7,  8,  9, 10],
       [ 4,  5,  6,  7,  8,  9, 10, 11]])

【讨论】:

  • “Numpy 假设一维数组行向量” - 不,它没有,或者像 (2, 2) shape array dot (2,) shape array 之类的东西不起作用。一维数组是一维数组。不同的操作可能会将它们视为行或列,具体取决于上下文。
  • 如果需要,更准确的说法是 (n,) 广播到 (1,n)。为了避免歧义,扩展到 (n,1) 必须是明确的。
  • 如果你真的想要明确,使用np.newaxis而不是None
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多