编程语言
首页 > 编程语言> > python – 为什么numpy.broadcast“转置”vstack和类似函数的结果?

python – 为什么numpy.broadcast“转置”vstack和类似函数的结果?

作者:互联网

注意:

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]])

类似地,对于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)]

这告诉我们,如果我们在数组上执行实际操作(比方说,xx),NumPy将返回一个shape(3,)数组,一个维度并组合元组中的元素以生成最终数组中的值(例如它将执行1 1,2 2,3 3添加).

如果你深入研究vstack的源代码,你会发现all it does确保它所给出的iterable元素至少是二维的,然后沿着0轴堆叠它们.

在b = np.broadcast(x,x)的情况下,这意味着我们将以下数组堆叠:

>>> [np.atleast_2d(_m) for _m in b]
[array([[1, 1]]), array([[2, 2]]), array([[3, 3]])]

然后将这三个小阵列垂直堆叠,产生您注意到的输出.

1究竟如何并行迭代不同维度的数组是NumPy广播如何运作的核心.代码可以在iterators.c中找到.有关NumPy多维迭代器的有趣概述,由Travis Oliphant自己编写,可以在Beautiful Code书中找到.

标签:python,arrays,numpy,numpy-broadcasting
来源: https://codeday.me/bug/20190519/1135434.html