我最近遇到了以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)向量。
我只是想知道 - 这种行为是否有充分的理由(即这是行为可取的) - 或者它只是广播规则定义方式的副产品。
答案 0 :(得分:3)
基本思想是当一个或另一个数组需要迭代以使结果形状有意义时,然后迭代地对主轴的每个条目执行操作(另外,NumPy提供了使迭代发生的方法。如果需要,可以使用不同的轴,例如使用einsum
)。
在这种情况下,x
沿其长轴有100个不同的东西,每个东西都单独添加到y
。我们只取第一个值x[0]
并将其添加到y
。现在,我们正在讨论y
有100个迭代添加到x[0]
的内容,因此结果是y
形状。对x[1]
重复此操作,依此类推。
如果您执行x.T
,那么沿着x
的主轴只有一件事,即长度为100"行"。因此,它可以在没有修改的情况下以元素方式添加到y
,因此不需要再进行广播,并且您可以获得“天真的”#34;你可能想过的矢量数学运算。
NumPy的广播规则试图在大量可能的计算和操作中对编程和迭代有效,许多与线性代数或公共向量/矩阵运算完全无关。因此,广播并不总是(并且不应该总是)假设某些东西,以便为线性代数赋予期望特权。