何时应该使用hstack / vstack vs append vs concatenate vs column_stack?

126
简单问题:这些方法各自有什么优点?在给定正确的参数和ndarray形状的情况下,它们似乎都可以等效地工作。有些是原地操作?有更好的性能?我应该在什么时候使用哪些函数?
4个回答

87
如果你有两个矩阵,只需使用 hstackvstack:

如果你要堆叠一个矩阵和一个向量,则使用 hstack 变得棘手,所以更好的选择是使用 column_stack

如果你要堆叠两个向量,则有三种选项:

concatenate 的原始形式适用于3D及以上,请参见我的文章Numpy Illustrated获取详细信息。


那么,我们什么时候应该使用append,什么时候使用concatenate呢? - skan
1
@skan append在内部使用concatenate。除了如果没有给定axisappend会将两个参数都展平之外,appendconcatenate之间没有区别。相比于concatenateappend节省了一些按键次数 - 这是它存在的唯一好处 :) 在Pandas中,他们正在弃用append,而推荐使用concatconcatenate的快捷方式),因为使用append逐步向数据框追加行的做法是不好的,而应该将它们追加到Python列表中,并在一次操作中进行连接(这样更快)。 - Antony Hatchkins

60
所有函数都是用Python编写的,除了np.concatenate。如果使用IPython shell,只需使用??即可。
如果不是,这里是他们代码的摘要:
vstack
concatenate([atleast_2d(_m) for _m in tup], 0)
i.e. turn all inputs in to 2d (or more) and concatenate on first

hstack
concatenate([atleast_1d(_m) for _m in tup], axis=<0 or 1>)

colstack
transform arrays with (if needed)
    array(arr, copy=False, subok=True, ndmin=2).T

append
concatenate((asarray(arr), values), axis=axis)

换句话说,它们都通过调整输入数组的维度,然后在右轴上进行连接来工作。它们只是方便的函数。
还有较新的np.stack
arrays = [asanyarray(arr) for arr in arrays]
shapes = set(arr.shape for arr in arrays)
result_ndim = arrays[0].ndim + 1
axis = normalize_axis_index(axis, result_ndim)
sl = (slice(None),) * axis + (_nx.newaxis,)

expanded_arrays = [arr[sl] for arr in arrays]
concatenate(expanded_arrays, axis=axis, out=out)

即它扩展了所有输入的维度(有点像np.expand_dims),然后进行串联。 使用axis=0,其效果与np.array相同。 文档现在添加:

函数concatenatestackblock提供了更一般的堆叠和串联操作。

np.block也是新的。 它实际上是沿嵌套列表递归连接。

25

numpy.vstack:将数组沿垂直方向(行方向)按顺序叠加。等同于np.concatenate(tup, axis=0),示例请参见:https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html

numpy.hstack:将数组沿水平方向(列方向)按顺序叠加。等同于np.concatenate(tup, axis=1),但对于一维数组,它是沿第一个轴连接。 示例请参见:https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html

append是Python内置数据结构list的函数。每次添加元素到列表中,显然,要添加多个元素,你将使用extend。简而言之,NumPy的函数更加强大。

示例:

假设gray.shape = (n0,n1)

np.vstack((gray,gray,gray))将具有形状(n0*3, n1),也可以通过np.concatenate((gray,gray,gray),axis=0)来实现

np.hstack((gray,gray,gray))将具有形状(n0, n1*3),也可以通过np.concatenate((gray,gray,gray),axis=1)来实现

np.dstack((gray,gray,gray))将具有形状(n0, n1,3)。


除了1-D数组,它会沿着第一个轴进行连接。这行代码解决了我的问题,谢谢! - Dev_Man

18
在IPython中,您可以输入函数名称,后跟??来查看函数的源代码。查看hstack,我们可以看到它实际上只是concatenate的包装器(类似于vstackcolumn_stack)。
np.hstack??
def hstack(tup):
...
    arrs = [atleast_1d(_m) for _m in tup]
    # As a special case, dimension 0 of 1-dimensional arrays is "horizontal"
    if arrs[0].ndim == 1:
        return _nx.concatenate(arrs, 0)
    else:
        return _nx.concatenate(arrs, 1)

所以,我猜你只需使用那个名称最符合逻辑的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接