关于 python:Numpy 一维数组在广播时被视为列向量

Numpy 1D arrays treated as column vectors when it comes to broadcasting

在有关广播规则的文档中,声明两个维度??在以下任一情况下是兼容的:

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

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

1
2
3
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 数组一起广播。
例如:

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

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

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

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

ValueError: operands could not be broadcast together with shapes (3,2) (3,)

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


Is the reason behind this, that when it comes to broadcasting rules 1d arrays are treated as column vectors, and hence shape compatibility is checked along the second axis on the 2d array?

相反,它们被视为行向量并垂直堆叠。你可以从相关文章中看到这张图。

你可以在你介绍的情况下做同样的草图:

1
2
3
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 沿第一个维度(即行)重复。您可以通过复制

之后的维度来将缺失的维度想象为"调整大小"