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

Ste*_*van 57 python numpy

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

hpa*_*ulj 29

您是否可以访问这些功能的代码?所有都是用Python编写的,除了np.concatenate.使用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)
Run Code Online (Sandbox Code Playgroud)

换句话说,它们都通过调整输入数组的尺寸,然后在右轴上连接来工作.它们只是便利功能.


更新的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)
Run Code Online (Sandbox Code Playgroud)

也就是说,它扩展了所有输入的暗淡(有点像np.expand_dims),然后连接.用axis=0,效果是一样的np.array.

hstack 文档现在添加:

这些功能concatenate,stackblock提供更一般的堆叠和连接操作.

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

  • “您可以访问这些功能的代码吗?” -numpy是[开源](https://github.com/numpy/numpy) (3认同)

Ant*_*ins 20

如果您有两个矩阵,则可以只使用hstackand vstack

如果你堆叠一个矩阵和一个向量,hstack使用起来会很棘手,所以column_stack是一个更好的选择:

如果要堆叠两个向量,则有以下三种选择:

concatenate在它的原始形式是3D和上面有用的,看我的文章numpy的画报了解详情。

  • 这篇文章超级有帮助!! (3认同)
  • @skan `append` 在内部使用 `concatenate`。追加和连接之间没有区别,除了如果没有给出“axis”,“append”会展平两个参数。与“concatenate”相比,“Append”可以节省一些击键次数 - 这是拥有它的唯一好处:) 在 Pandas 中,由于不好的做法,他们不赞成使用“append”,而是使用“concat”(连接的快捷方式)使用“append”将行增量附加到数据帧,而不是将它们附加到 python 列表并一次性连接所有内容(这样更快)。 (2认同)

Yuc*_*ang 16

numpy.vstack:垂直堆栈数组(行方式).等效np.concatenate(tup, axis=0) 示例请参阅:https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html

numpy.hstack:在序列堆栈阵列水平地(逐列).Equivalent到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).


max*_*moo 7

在IPython中,您可以通过键入函数名称(后跟)来查看函数的源代码??。看一下hstack我们可以看到它实际上只是一个包装器concatenate(与vstack和相似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)
Run Code Online (Sandbox Code Playgroud)

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