在python的numpy库中有一个函数np.stack(), 看过一些博文后觉得别人写的太复杂,然后自己有了一些理解之后做了一些比较简单的解释

np.stack

首先stack函数用于堆叠数组,其调用方式如下所示:

np.stack(arrays,axis=0)

其中arrays即需要进行堆叠的数组,axis是堆叠时使用的轴,比如:

arrays = [[1,2,3,4], [5,6,7,8]]

这是一个二维数组,axis=0表示的是第一维,也即是arrays[0] = [1,2,3,4]或者arrays[1] = [5,6,7,8]

axis=i时,代表在堆叠时首先选取第i维进行“打包”

具体例子:

当执行np.stack(arrays, axis=0)时,取出第一维的1、2、3、4,打包,[1, 2, 3, 4],其余的类似,然后结果如下:

  1.  
    >>> arrays = [[1,2,3,4], [5,6,7,8]]
  2.  
    >>> arrays=np.array(arrays)
  3.  
    >>> np.stack(arrays,axis=0)
  4.  
    array([[1, 2, 3, 4],
  5.  
    [5, 6, 7, 8]])

当执行np.stack(arrays, axis=1)时,先对arrays中的第二维进行“打包”,也即是将1、5打包成[1, 5],其余的类似,结果如下:

  1.  
    >>> np.stack(arrays, axis=1)
  2.  
    array([[1, 5],
  3.  
    [2, 6],
  4.  
    [3, 7],
  5.  
    [4, 8]])

有这个“打包”的概念后,对于三维的数组堆叠也不难理解了,例如:

a = np.array([[1,2,3,4], [5,6,7,8]])

arrays = np.asarray([a, a , a])

  1.  
    >>> arrays
  2.  
    array([[[1, 2, 3, 4],
  3.  
    [5, 6, 7, 8]],
  4.  
     
  5.  
    [[1, 2, 3, 4],
  6.  
    [5, 6, 7, 8]],
  7.  
     
  8.  
    [[1, 2, 3, 4],
  9.  
    [5, 6, 7, 8]]])

执行np.stack(arrays, axis=0),也就是对第一维进行打包,结果如下:

  1.  
    >>> np.stack(arrays, axis=0)
  2.  
    array([[[1, 2, 3, 4],
  3.  
    [5, 6, 7, 8]],
  4.  
     
  5.  
    [[1, 2, 3, 4],
  6.  
    [5, 6, 7, 8]],
  7.  
     
  8.  
    [[1, 2, 3, 4],
  9.  
    [5, 6, 7, 8]]])

执行np.stack(arrays, axis=1),也就是对第二维进行打包,取出第二维的元素[1,2,3,4]、[1,2,3,4]、[1,2,3,4],打包,[[1,2,3,4],[1,2,3,4],[1,2,3,4]],对其余的也做类似处理,结果如下:

  1.  
    >>> np.stack(arrays, axis=1)
  2.  
    array([[[1, 2, 3, 4],
  3.  
    [1, 2, 3, 4],
  4.  
    [1, 2, 3, 4]],
  5.  
     
  6.  
    [[5, 6, 7, 8],
  7.  
    [5, 6, 7, 8],
  8.  
    [5, 6, 7, 8]]])

执行np.stack(arrays, axis=2),与之前类似,取出第三维元素1、1、1,打包[1,1,1],结果如下:

  1.  
    >>> np.stack(arrays, axis=2)
  2.  
    array([[[1, 1, 1],
  3.  
    [2, 2, 2],
  4.  
    [3, 3, 3],
  5.  
    [4, 4, 4]],
  6.  
     
  7.  
    [[5, 5, 5],
  8.  
    [6, 6, 6],
  9.  
    [7, 7, 7],
  10.  
    [8, 8, 8]]])

总结而言,也就是arrays是你要进行堆叠的数组,axis控制你要将arrays中哪个维度组合起来(也就是文中的“打包”)。

np.concatenate

np.concatenate((a1,a2,a3,...), axis=0),这个函数就是按照特定方向轴进行拼接,默认是第一维,在numpy官网上的示例如下:

  1.  
    >>> a = np.array([[1, 2], [3, 4]])
  2.  
    >>> b = np.array([[5, 6]])
  3.  
    >>> np.concatenate((a, b), axis=0)
  4.  
    array([[1, 2],
  5.  
    [3, 4],
  6.  
    [5, 6]])
  7.  
    >>> np.concatenate((a, b.T), axis=1)
  8.  
    array([[1, 2, 5],
  9.  
    [3, 4, 6]])

当axis=0时,将b的元素加到a的尾部,这里比较难以理解的是第二个np.concatenate((a, b.T), axis=1),其实也类似,b.T的shape为(1,2),axis=1,则在a的第二维加上b的每个元素,所以这里axis=i时, 输入参数(a1,a2,a3...)除了第i维,其余维度的shape应该一致,例如:

  1.  
    >>> a = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
  2.  
    >>> b = np.array([[[1,2,3],[4,5,6]]])
  3.  
    >>> np.concatenate((a, b), axis=0)
  4.  
    array([[[1, 2, 3],
  5.  
    [4, 5, 6]],
  6.  
     
  7.  
    [[1, 2, 3],
  8.  
    [4, 5, 6]],
  9.  
     
  10.  
    [[1, 2, 3],
  11.  
    [4, 5, 6]]])

这里a的shape为(2,2,3),b的shape为(1,2,3),axis=0则要求a,b在其他两维的形状是一致的,如果直接在其他维度进行concatenate操作则会报错(因为axis=1时,a和b在第一维的长度不一致):

  1.  
    >>> np.concatenate((a, b), axis=1)
  2.  
    Traceback (most recent call last):
  3.  
    File "<stdin>", line 1, in <module>
  4.  
    ValueError: all the input array dimensions except for the concatenation axis must match exactly
  5.  
    >>> np.concatenate((a, b), axis=2)
  6.  
    Traceback (most recent call last):
  7.  
    File "<stdin>", line 1, in <module>
  8.  
    ValueError: all the input array dimensions except for the concatenation axis must match exactly

下面一个例子能够说明:

  1.  
    >>> c=np.array([[[5,6,7],[7,8,9]],[[4,5,6],[5,6,7]]])
  2.  
    >>> c
  3.  
    array([[[5, 6, 7],
  4.  
    [7, 8, 9]],
  5.  
     
  6.  
    [[4, 5, 6],
  7.  
    [5, 6, 7]]])
  8.  
    >>> c.shape
  9.  
    (2, 2, 3)
  10.  
    >>> np.concatenate((a, c), axis=1)
  11.  
    array([[[1, 2, 3],
  12.  
    [4, 5, 6],
  13.  
    [5, 6, 7],
  14.  
    [7, 8, 9]],
  15.  
     
  16.  
    [[1, 2, 3],
  17.  
    [4, 5, 6],
  18.  
    [4, 5, 6],
  19.  
    [5, 6, 7]]])
  20.  
    >>> np.concatenate((a, c), axis=2)
  21.  
    array([[[1, 2, 3, 5, 6, 7],
  22.  
    [4, 5, 6, 7, 8, 9]],
  23.  
     
  24.  
    [[1, 2, 3, 4, 5, 6],
  25.  
    [4, 5, 6, 5, 6, 7]]])

np.hstack

np.hstack(tup),  按照列的方向堆叠, tup可以是元组,列表,或者numpy数组, 其实也就是axis=1,即

np.hstack(tup) = np.concatenate(tup, axis=1)

按照上面对concatenate的理解则下面的示例很好理解

  1.  
    >>> a = np.array((1,2,3))
  2.  
    >>> b = np.array((2,3,4))
  3.  
    >>> np.hstack((a,b))
  4.  
    array([1, 2, 3, 2, 3, 4])
  5.  
    >>> a = np.array([[1],[2],[3]])
  6.  
    >>> b = np.array([[2],[3],[4]])
  7.  
    >>> np.hstack((a,b))
  8.  
    array([[1, 2],
  9.  
    [2, 3],
  10.  
    [3, 4]])

np.vstack

np.vstack(tup),  按照行的方向堆叠, tup可以是元组,列表,或者numpy数组, 理解起来与上相同

np.vstack(tup) = np.concatenate(tup, axis=0)

  1.  
    >>> a = np.array([1, 2, 3])
  2.  
    >>> b = np.array([2, 3, 4])
  3.  
    >>> np.vstack((a,b))
  4.  
    array([[1, 2, 3],
  5.  
    [2, 3, 4]])
  1.  
    >>> a = np.array([[1], [2], [3]])
  2.  
    >>> b = np.array([[2], [3], [4]])
  3.  
    >>> np.vstack((a,b))
  4.  
    array([[1],
  5.  
    [2],
  6.  
    [3],
  7.  
    [2],
  8.  
    [3],
  9.  
    [4]])

对于第二段代码,a的第一维元素分别时[1],[2],[3],所以堆叠时将b的对应元素直接加入

np.dstack

np.dstack(tup), 按照第三维方向堆叠,也即是

np.dstack(tup) = np.concatenate(tup, axis=2), 这里较好理解,所以直接放官网的示例

  1.  
    >>> a = np.array((1,2,3))
  2.  
    >>> b = np.array((2,3,4))
  3.  
    >>> np.dstack((a,b))
  4.  
    array([[[1, 2],
  5.  
    [2, 3],
  6.  
    [3, 4]]])
  1.  
    >>> a = np.array([[1],[2],[3]])
  2.  
    >>> b = np.array([[2],[3],[4]])
  3.  
    >>> np.dstack((a,b))
  4.  
    array([[[1, 2]],
  5.  
    [[2, 3]],
  6.  
    [[3, 4]]])

np.column_stack和np.row_stack

np.column_stack函数将一维的数组堆叠为二维数组,方向为列

np.row_stack函数将一维的数组堆叠为二维数组,方向为行

其实如果对前面的内容理解之后这两个算是比较简单的了

  1.  
    >>> a = np.array((1,2,3))
  2.  
    >>> b = np.array((2,3,4))
  3.  
    >>> np.column_stack((a,b))
  4.  
    array([[1, 2],
  5.  
    [2, 3],
  6.  
    [3, 4]])
  1.  
    >>> np.row_stack([np.array([1, 2, 3]), np.array([4, 5, 6])])
  2.  
    array([[1, 2, 3],
  3.  
    [4, 5, 6]])

总结

其实也就是两种操作,stack和concatenate,其中stack是首先找到axis轴的元素,然后对该轴的元素进行组合,然后形成新的数组,而concatenate则是在axis轴进行拓展,将a1,a2,a3...按照axis指定的轴进行增加操作...

numpy中数据合并,stack ,concentrate,vstack,hstack的更多相关文章

  1. [转]numpy中数据合并,stack ,concentrate,vstack,hstack

    转自:https://www.cnblogs.com/onemorepoint/p/9541761.html 在python的numpy库中有一个函数np.stack() np.stack 首先sta ...

  2. Numpy中数据的常用的保存与读取方法

    小书匠 深度学习  文章目录: 1.保存为二进制文件(.npy/.npz) numpy.save numpy.savez numpy.savez_compressed 2.保存到文本文件 numpy. ...

  3. Python Numpy中数据的常用的保存与读取方法

    在经常性读取大量的数值文件时(比如深度学习训练数据),可以考虑现将数据存储为Numpy格式,然后直接使用Numpy去读取,速度相比为转化前快很多. 下面就常用的保存数据到二进制文件和保存数据到文本文件 ...

  4. numpy 中的堆叠 stack

    参考: https://blog.csdn.net/Riverhope/article/details/78922006 vstack,vertical 垂直堆叠 hstack, horizontal ...

  5. Numpy中数据的常用的保存与读取

    保存到文本文件numpy.savetxt()numpy.loadtxt() import numpy as np x= np.arange(0,10,0.1) np.savetxt('save_x', ...

  6. Python numpy中矩阵的用法总结

    关于Python Numpy库基础知识请参考博文:https://www.cnblogs.com/wj-1314/p/9722794.html Python矩阵的基本用法 mat()函数将目标数据的类 ...

  7. Python-OpenCV中图像合并显示

    在图像处理中,我们通常需要将原图像与处理后的图像放在同一个窗口显示,这样便于比较. 首先,需要介绍Numpy中的两个函数:hstack().vstack(). 函数原型:hstack(tup) ,参数 ...

  8. 基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 下面小编就为大家分享一篇基于Python中numpy数组的合并实例讲解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 Python中n ...

  9. Pandas中DataFrame数据合并、连接(concat、merge、join)之merge

    二.merge:通过键拼接列 类似于关系型数据库的连接方式,可以根据一个或多个键将不同的DatFrame连接起来. 该函数的典型应用场景是,针对同一个主键存在两张不同字段的表,根据主键整合到一张表里面 ...

随机推荐

  1. ASP.NET Core -中间件(Middleware)使用

    ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...

  2. asp.net 用JWT来实现token以此取代Session

    先说一下为什么要写这一篇博客吧,其实个人有关asp.net 会话管理的了解也就一般,这里写出来主要是请大家帮我分析分析这个思路是否正确.我以前有些有关Session的也整理如下: 你的项目真的需要Se ...

  3. 如何将 Java 项目转换成 Maven 项目

    本文内容 Java 项目 Maven 项目 Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目.首先要明确的是,用 Maven 管理 Java 项目的确 ...

  4. mac上配置mysql与redis server,并结合Pydev准备某爬虫环境

    mysql下安装mysql server mysql下安装redis server:https://www.jianshu.com/p/3bdfda703552 mac下安装配置redis:https ...

  5. 微软BI 之SSRS 系列 - 如何让报表在一页显示,两种常用的技巧

    通常情况下,SSRS 报表在页面内容过多的时候会自动分页.但有的时候当页面内容不是很多,大概最多2页的情况下,或者客户要求所有内容必须在一页显示时,应该如何设置. 实际上,要考虑两种情况:第一种情况是 ...

  6. SpringBoot 2.x 整合ElasticSearch的demo

    SpringBoot 2.x 整合ElasticSearch的demo 1.配置文件application.yml信息 # Tomcat server: tomcat: uri-encoding: U ...

  7. 天猫魔盒1代TMB100E刷机, 以及右声道无声的问题

    这个是在小米盒子1代之后买的, 当时速度比小米盒子快, 除了遥控器比较软, 电池盖不太对得齐以外, 用起来还不错. 但是时间长了之后总是不停自己升级, 自己安装一些应用, 还删不了, 要知道这个盒子的 ...

  8. Codeforces Round #277.5 (Div. 2)C——Given Length and Sum of Digits...

    C. Given Length and Sum of Digits... time limit per test 1 second memory limit per test 256 megabyte ...

  9. 【Android】详解Android 网络操作

    目录结构: contents structure [+] 判断网络 判断是否有网络连接 判断WIFI网络是否可用 判断MOBILE网络是否可用 获取当前网络连接的类型信息 监听网络 获取网络信息需要在 ...

  10. [AaronYang]那天有个小孩跟我说Js-NodeJS[AY0]-EJS

    按照自己的思路学习Node.Js 随心出发.EJS是Node.js中express框架中使用的一个模版引擎,当然还有Jade 我的学习就靠网上查资料,没有买书系统学,自己整理,如果有用了哪位大神的代码 ...