我最近在使用 numpy 进行广播时遇到了以下问题。
y = randn(100)
x = randn(100,1)
(y+x).shape
> 100,100
虽然我意识到这是根据https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html的规则,但它似乎与人们所期望的相反——结果是(100,1) 向量。
我只是想知道 - 这种行为是否有充分的理由(即这是可取的行为) - 或者它只是定义广播规则的方式的副产品。
我最近在使用 numpy 进行广播时遇到了以下问题。
y = randn(100)
x = randn(100,1)
(y+x).shape
> 100,100
虽然我意识到这是根据https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html的规则,但它似乎与人们所期望的相反——结果是(100,1) 向量。
我只是想知道 - 这种行为是否有充分的理由(即这是可取的行为) - 或者它只是定义广播规则的方式的副产品。
基本思想是,当一个或另一个数组需要迭代以使结果形状有意义时,您将迭代地对主轴的每个条目执行操作(另外,NumPy 提供了使迭代发生在不同轴上的方法,如果需要,例如使用einsum
)。
在这种情况下,x
沿其主轴有 100 个不同的事物,每个事物都单独添加到y
. 让我们只取第一个值x[0]
并将其添加到y
. 现在我们正在讨论y
将 100 个事物迭代地添加到 中x[0]
,因此结果是事物的形状y
。重复此操作x[1]
以此类推。
如果你这样做x.T
了,那么沿着x
的主轴只有一件事,即长度为 100 的“行”。因此,它可以在y
不修改的情况下按元素添加,因此不需要更多的广播,并且您会得到您可能想到的“幼稚”矢量数学运算。
NumPy 的广播规则正试图在大量可能的计算和操作中有效地进行编程和迭代,其中许多与线性代数或常见的向量/矩阵运算完全无关。所以广播并不总是(也不应该总是)为了优先考虑线性代数的期望而假设事情。