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

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

Stefan Sullivan asked 2019-11-08T03:53:48Z
3个解决方案
28 votes

您可以访问这些功能的代码吗? 除了np.block以外,所有代码都是用Python编写的。使用IPython Shell,您只需使用stack

如果不是,则为以下代码摘要:

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.block

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.block),然后进行串联。 使用stack,效果与block相同。

np.block文档现在添加了:

功能np.blockstack和   block提供更多常规堆叠和串联操作。

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

hpaulj answered 2019-11-08T03:54:51Z
15 votes

numpy.vstack:按垂直顺序(行方向)堆叠数组。等效于np.dstack((gray,gray,gray))示例,请参见:[https://docs.scipy.org/doc/numpy/reference/generation/numpy.vstack.html]

numpy.hstack:按水平顺序排列数组(按列排列),等效于np.dstack((gray,gray,gray)),但一维数组沿第一个轴连接时除外。 示例请参见:[https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html]

append是python内置数据结构np.dstack((gray,gray,gray))的函数。每次将元素添加到列表中。 显然,要添加多个元素,您将使用np.concatenate((gray,gray,gray),axis=1)。简单地说,numpy的功能更强大。

例:

假设gray.shape =(n0,n1)

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

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

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

Yuchao Jiang answered 2019-11-08T03:55:57Z
7 votes

在IPython中,您可以通过键入函数名称后跟??来查看函数的源代码。查看hstack,我们可以看到它实际上只是concatenate(与260462372888982424258和vstack相似)的包装:

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)

因此,我想只要使用对您来说最合乎逻辑的名称即可。

maxymoo answered 2019-11-08T03:56:30Z
translate from https://stackoverflow.com:/questions/33356442/when-should-i-use-hstack-vstack-vs-append-vs-concatenate-vs-column-stack