zeg*_*jan 5 python arrays numpy numpy-broadcasting
注意:
In [1]: import numpy as np
In [2]: x = np.array([1, 2, 3])
In [3]: np.vstack([x, x])
Out[3]:
array([[1, 2, 3],
[1, 2, 3]])
In [4]: np.vstack(np.broadcast(x, x))
Out[4]:
array([[1, 1],
[2, 2],
[3, 3]])
Run Code Online (Sandbox Code Playgroud)
类似地对于column_stack和row_stack(hstack在这种情况下表现不同但在与广播一起使用时也有所不同).为什么?
我追求的是背后的逻辑,而不是找到一种"修复"这种行为的方式(我对它很好,它只是不直观).
np.broadcast返回一个迭代器对象的实例,该对象描述了如何一起广播数组.1除其他外,它描述了结果数组将具有的形状和维数.
至关重要的是,当您在Python中实际迭代此对象时,您将从每个输入数组中获取元素元组:
>>> b = np.broadcast(x, x)
>>> b.shape
(3,)
>>> b.ndim
1
>>> list(b)
[(1, 1), (2, 2), (3, 3)]
Run Code Online (Sandbox Code Playgroud)
这就告诉我们,如果我们对阵列进行实际操作(比如x+x)NumPy的将返回形状的阵列(3,),一个尺寸,然后在元组产生最终的数组中的值相结合的元素(例如,它会执行1+1,2+2,3+3为了补充).
如果你深入研究vstack你的来源,发现它所做的就是确保它所给出的迭代元素至少是二维的,然后沿着轴0堆叠它们.
在这种情况下b = np.broadcast(x, x),我们将以下数组进行堆栈:
>>> [np.atleast_2d(_m) for _m in b]
[array([[1, 1]]), array([[2, 2]]), array([[3, 3]])]
Run Code Online (Sandbox Code Playgroud)
然后将这三个小阵列垂直堆叠,产生您注意到的输出.
1究竟如何并行迭代不同维度的数组是NumPy广播如何运作的核心.代码主要在iterators.c中找到.由Travis Oliphant自己编写的NumPy多维迭代器的有趣概述可以在Beautiful Code中找到.