numpy vstack vs. column_stack

Zen*_*nce 40 python numpy

numpy vstackcolumn_stack.之间究竟有什么区别?通过阅读文档,它看起来好像column_stack是一vstack维数组的实现.这是一个更有效的实施吗?否则,我找不到一个原因vstack.

mgi*_*son 80

我认为以下代码很好地说明了差异:

>>> np.vstack(([1,2,3],[4,5,6]))
array([[1, 2, 3],
       [4, 5, 6]])
>>> np.column_stack(([1,2,3],[4,5,6]))
array([[1, 4],
       [2, 5],
       [3, 6]])
>>> np.hstack(([1,2,3],[4,5,6]))
array([1, 2, 3, 4, 5, 6])
Run Code Online (Sandbox Code Playgroud)

我也包括在内hstack进行比较.注意如何column_stack沿第二维vstack堆叠,而沿第一维堆叠.相当于column_stack以下hstack命令:

>>> np.hstack(([[1],[2],[3]],[[4],[5],[6]]))
array([[1, 4],
       [2, 5],
       [3, 6]])
Run Code Online (Sandbox Code Playgroud)

我希望我们能够同意column_stack更方便.

  • `column_stack` 的一个更简单的等效项是 `np.vstack(([1,2,3],[4,5,6])).T`,它仅因转置而不同,如 @SethMMorton 答案中所示。 (2认同)

Set*_*ton 9

column_stack的Notes部分中,它指出了这一点:

这个功能相当于np.vstack(tup).T.

其中有许多函数numpy是其他函数的方便包装器.例如,vstack的Notes部分说:

相当于np.concatenate(tup, axis=0)if tup包含至少为2维的数组.

它看起来column_stack只是一个方便的功能vstack.


Ant*_*ins 7

hstack水平vstack堆叠,垂直堆叠:

问题hstack在于,当您附加一列时,您需要先将其从一维数组转换为二维列,因为一维数组通常被解释为 numpy 中二维上下文中的向量行:

a = np.ones(2)          # 2d, shape = (2, 2)
b = np.array([0, 0])    # 1d, shape = (2,)

hstack((a, b)) -> dimensions mismatch error
Run Code Online (Sandbox Code Playgroud)

因此,要么hstack((a, b[:, None]))column_stack((a, b))

whereNone作为 的快捷方式np.newaxis

如果要堆叠两个向量,则有以下三种选择:

至于 (undocumented) row_stack,它只是 的同义词vstack,因为一维数组已准备好用作矩阵行而无需额外工作。

事实证明 3D 及以上的情况太大而无法纳入答案,因此我将其包含在名为Numpy Illustrated的文章中。