numpy vstack
和column_stack
之间究竟有什么区别?阅读文档,看起来column_stack
是1D数组vstack
的实现。这是一个更有效的实施吗?否则,我找不到只有vstack
的原因。
答案 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
的同义词,因为一维数组可以用作矩阵行,而无需额外的工作。