numpy vstack vs. column_stack

时间:2013-05-09 23:51:59

标签: python numpy

numpy vstackcolumn_stack之间究竟有什么区别?阅读文档,看起来column_stack是1D数组vstack的实现。这是一个更有效的实施吗?否则,我找不到只有vstack的原因。

3 个答案:

答案 0 :(得分:76)

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

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

我还包括hstack进行比较。注意column_stack如何沿第二维堆叠,而vstack沿第一维堆叠。相当于column_stack的是以下hstack命令:

>>> np.hstack(([[1],[2],[3]],[[4],[5],[6]]))
array([[1, 4],
       [2, 5],
       [3, 6]])

我希望我们同意column_stack更方便。

答案 1 :(得分:9)

column_stack的“备注”部分中,它指出了这一点:

  

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

numpy中有许多函数可以方便地包装其他函数。例如,vstack的Notes部分说:

  

如果tup包含至少为2维的数组,则等效于np.concatenate(tup, axis=0)

看起来column_stack只是vstack的便利函数。

答案 2 :(得分:1)

hstack水平堆叠:

1 1     0 0     hstack     1 1 0 0
1 1     0 0       ->       1 1 0 0

vstack垂直堆叠:

1 1            1 1    
1 1   vstack   1 1
        ->     0 0 
0 0            0 0 
0 0

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

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

hstack((a, b)) -> dimensions mismatch error

所以

hstack((a, b[:, None]))     # None is a shortcut for np.newaxis here

column_stack((a, b)) 

对于(未记录的)row_stack,它只是vstack的同义词,因为一维数组可以用作矩阵行,而无需额外的工作。