numpy中的广播(N,)和(N,1)数组

时间:2016-11-29 13:02:07

标签: python numpy-broadcasting

我最近遇到了以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)向量。

我只是想知道 - 这种行为是否有充分的理由(即这是行为可取的) - 或者它只是广播规则定义方式的副产品。

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的广播规则试图在大量可能的计算和操作中对编程和迭代有效,许多与线性代数或公共向量/矩阵运算完全无关。因此,广播并不总是(并且不应该总是)假设某些东西,以便为线性代数赋予期望特权。