什么时候我应该使用hstack / vstack vs append vs concatenate vs column_stack

时间:2015-10-26 22:02:44

标签: python numpy

简单的问题:每种方法的优点是什么。似乎给定正确的参数(和ndarray形状),它们看起来都是等效的。做一些工作吗?有更好的表现?我应该使用哪些功能?

3 个答案:

答案 0 :(得分:25)

您是否可以访问这些功能的代码?除了np.concatenate之外,所有内容都是用Python编写的。使用IPython shell,您只需使用??

如果没有,这里是他们代码的摘要:

vstack
concatenate([atleast_2d(_m) for _m in tup], 0)
i.e. turn all imputs 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相同。

hstack文档现在添加:

  

函数concatenatestack和   block提供更一般的堆叠和连接操作。

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

答案 1 :(得分:10)

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

答案 2 :(得分:5)

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

所以我猜你只需使用最具逻辑性的名字。