gpt4 book ai didi

python - 为什么 numpy.broadcast "transpose"vstack 和类似函数的结果?

转载 作者:太空狗 更新时间:2023-10-30 01:06:35 26 4
gpt4 key购买 nike

观察:

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

这告诉我们,如果我们对数组执行实际操作(例如,x+x),NumPy 将返回形状为 (3,) 的数组,一维并组合元组中的元素以生成最终数组中的值(例如,它将执行 1+12+23+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 中找到.可以在 Beautiful Code 中找到由 Travis Oliphant 自己编写的 NumPy 多维迭代器的有趣概述。书。

关于python - 为什么 numpy.broadcast "transpose"vstack 和类似函数的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36253211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com