【问题标题】:Numpy 1D arrays treated as column vectors when it comes to broadcastingNumpy 一维数组在广播时被视为列向量
【发布时间】:2020-02-17 15:03:34
【问题描述】:

broadcasting rules 的文档中,声明两个维度​​在以下任一情况下都兼容:

  • 它们相等或
  • 其中一个是 1

通过显示的一些示例,这一点变得很清楚,例如:

A      (4d array):  8 x 1 x 6 x 1
B      (3d array):      7 x 1 x 5
Result (4d array):  8 x 7 x 6 x 5

这似乎很清楚。但是,当 1d 数组的形状与 2d 数组的第二轴的形状兼容时,我一直无法找到一个具体的示例/解释,说明为什么 1D 数组只能与 2d 数组一起广播。 比如:

np.ones((2,3)) * np.arange(3)

array([[0., 1., 2.],
       [0., 1., 2.]])

1d 范围已按预期跨行广播。但是,如果我们这样做:

np.ones((3, 2)) * np.arange(3)

ValueError: 操作数无法与形状 (3,2) (3,) 一起广播

我们收到不兼容形状的错误。这可能很简单,但我只想知道哪个是正确的解释。这背后的原因是,当涉及到广播规则时,一维数组被视为列向量,因此沿着二维数组的第二个轴检查形状兼容性?对于较大的数组,是否总是检查较大 ndarray 上的最后一个轴?

【问题讨论】:

  • 另一个规则是它可以添加新的前导维度。 (3,) 到 (1,3) 是自动的。要获得 (3,1),您必须自己添加尺寸 1 的暗淡。
  • 3d B 在广播期间变为 1 x 7 x 1 x 5。如果 A 缺少尾随 1,它将失败。
  • 是的。通过 (2x3) 和 (3) 兼容这一事实,这一点变得显而易见。为了使所有暗淡兼容,正如您所提到的,后者被重塑为 (1,3) 是有道理的,这样第二条规则就变得有效。 @hpaulj,它们可以被广播。感谢您的来信!

标签: python numpy


【解决方案1】:

这背后的原因是,当涉及到广播规则时,一维数组被视为列向量,因此沿着二维数组的第二个轴检查形状兼容性?

相反,它们被视为行向量并垂直堆叠。您可以在相关文章的this figure 中看到它。

你可以在你展示的案例中做同样的草图:

A   3 x 2    # np.ones((3, 2))
B   2 x 3    # np.ones((2, 3))
C       3    # np.arange(3)

这里A*C 不起作用,但B*C 起作用。这是因为C 沿第一个维度(即行)重复。您可以通过复制后面的维度来将缺失的维度想象为“调整大小”

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    相关资源
    最近更新 更多