【问题标题】:When should I use hstack/vstack vs append vs concatenate vs column_stack?我什么时候应该使用 hstack/vstack vs append vs concatenate vs column_stack?
【发布时间】:2015-10-26 22:02:44
【问题描述】:

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

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    如果您有两个矩阵,最好只使用 hstackvstack

    如果您要堆叠矩阵和向量,hstack 会变得难以使用,因此 column_stack 是更好的选择:

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

    concatenate 的原始形式对 3D 及更高版本很有用,请参阅 详情请看我的文章Numpy Illustrated

    【讨论】:

      【解决方案2】:

      np.concatenate 外,所有函数都是用Python 编写的。使用 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)
      

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

      hstack 文档现在添加:

      函数concatenatestackblock 提供更通用的堆叠和连接操作。

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

      【讨论】:

        【解决方案3】:

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

        所以我想只要使用对你来说最合乎逻辑的名字。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2015-03-09
            • 2019-08-14
            • 2021-12-19
            • 2019-11-04
            • 1970-01-01
            • 2017-06-04
            • 2019-12-06
            • 2017-12-01
            • 1970-01-01
            相关资源
            最近更新 更多