【发布时间】: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,它们可以被广播。感谢您的来信!