我什么时候应该使用 hstack/vstack,而不是 append 或 concatenate 或 column_stack?

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

77821 次浏览

In IPython you can look at the source code of a function by typing its name followed by ??. Taking a look at hstack we can see that it's actually just a wrapper around concatenate (similarly with vstack and column_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)

So I guess just use whichever one has the most logical sounding name to you.

除了 np.concatenate,所有函数都是用 Python 编写的。

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

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相同。

hstack文档现在补充道:

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

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

numpy.vstack: stack arrays in sequence 垂直的 (row wise).Equivalent to np.concatenate(tup, axis=0) example see: https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html

Hstack: 按序列 水平方向堆栈数组(以列为单位)。等效于 np.concatenate(tup, axis=1),除了它沿第一个轴连接的1-D 数组。例子见: https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html

Append 是 python 内置数据结构 list的函数。每次向列表中添加一个元素时。显然,要添加多个元素,您将使用 extend。简而言之,numpy 的功能要强大得多。

例如:

假设 gray.form = (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)。

如果你有两个矩阵,你可以选择 hstackvstack:

如果你正在叠加一个矩阵和一个向量,那么使用 hstack就变得很棘手,所以 column_stack是一个更好的选择:

如果你要叠加两个矢量,你有三个选择:

原始形式的 concatenate对3D 及以上非常有用,参见 我的文章 笨笨插图的细节。