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.], |
如预期的那样,1d 范围已跨行广播。但是,如果我们这样做:
1
|
np.ones((3, 2)) * np.arange(3)
|
ValueError: operands could not be broadcast together with shapes (3,2) (3,)
我们收到不兼容形状的错误。这可能很简单,但我只想知道哪个是正确的解释。这背后的原因是,当涉及到广播规则时,一维数组被视为列向量,因此沿着二维数组的第二个轴检查形状兼容性?对于较大的数组,是否总是检查较大 ndarray 上的最后一个轴?
- 另一条规则是它可以添加新的领先规范。 (3,) 到 (1,3) 是自动的。要获得 (3,1),您必须自己添加尺寸 1 的暗淡。
- 3d B 在广播期间变为 1 x 7 x 1 x 5。如果 A 缺少尾随 1,它将失败。
- 是的。通过 (2×3) 和 (3) 兼容这一事实,这一点变得显而易见。为了使所有暗淡兼容,正如您所提到的,后者被重塑为 (1,3) 是有道理的,这样第二条规则就变得有效。 @hpaulj,它们可以被广播。感谢您的注意!
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 沿第一个维度(即行)重复。您可以通过复制
之后的维度来将缺失的维度想象为”调整大小”
来源:https://www.codenong.com/60265219/