Python Numpy 1D阵列在广播时被视为列向量

Python Numpy 1D阵列在广播时被视为列向量,python,numpy,Python,Numpy,在的文档中,说明了两个维度在以下任一情况下是兼容的: 他们是平等的还是平等的 其中一个是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 这似乎很清楚。但是,我无法找到一个具体的示例/解释,说明为什么当一维阵列的形状与二维阵列的第二个轴的形状兼容时,一维阵列只能与二维阵列一起广播。 例如:

在的文档中,说明了两个维度在以下任一情况下是兼容的:

  • 他们是平等的还是平等的
  • 其中一个是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
这似乎很清楚。但是,我无法找到一个具体的示例/解释,说明为什么当一维阵列的形状与二维阵列的第二个轴的形状兼容时,一维阵列只能与二维阵列一起广播。 例如:

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

array([[0., 1., 2.],
       [0., 1., 2.]])
正如预期的那样,1d arange已跨行广播。但是,如果我们这样做:

np.ones((3, 2)) * np.arange(3)
ValueError:操作数无法与形状(3,2)(3,)一起广播

我们得到一个不兼容形状的错误。这可能很简单,但我只想知道哪个是正确的解释。这背后的原因是,当涉及到广播规则时,1d阵列被视为列向量,因此沿2d阵列上的第二个轴检查形状兼容性?对于更大的阵列,是否始终根据更大阵列上的最后一个轴进行检查

这背后的原因是,当涉及到广播规则时,1d阵列被视为列向量,因此沿2d阵列上的第二个轴检查形状兼容性

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

您可以在演示的案例中绘制相同的草图:

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
沿着第一个维度(即行)重复。您可以将缺少的维度想象为通过复制后面的维度来“调整大小”。另一个规则是,它可以添加新的前导维度。(3,)到(1,3)是自动的。要得到一个(3,1),你必须自己加上1号调暗。在播放过程中,3d
B
变成1 x 7 x 1 x 5。。如果A缺少尾随的1,则它将失败。是。由于(2x3)和(3)是兼容的,这一点变得很明显。要使所有DIM都兼容,有必要将后者重新调整为(1,3),如您所述,以便第二条规则生效@hpaulj和它们可以被广播。谢谢你的留言!