在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. SpringMVC拦截器详解

    拦截器是每个Web框架必备的功能,也是个老生常谈的主题了. 本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原理. 重要接口及类介绍 1. HandlerExecution ...

  2. 【Linux】Cent OS 虚拟机开机自启动配置

    一次断电,导致实体机关机了,虚拟机也连不上去,只好手动来起来. 我想增加一下自启动,让硬件开机的时候,自动启动虚拟机: 其实是有办法的,尝试了一下,也成功了,这里简单标记下. virsh autost ...

  3. CentOS下防御或减轻DDoS攻击方法(转)

    查看攻击IP 首先使用以下代码,找出攻击者IP netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n 将会得 ...

  4. Caused by: java.lang.ClassNotFoundException: Cannot find class解决办法

    mapper.xml中resultMap导致的.

  5. 【CLR】解析AppDomain

    目录结构: contents structure [+] 什么是AppDomain 跨越AppDomain边界访问对象 按引用封送(Marshal-by-Reference) 按值封送(Marshal ...

  6. 详述socket编程之select()和poll()函数

    转自:http://www.cppblog.com/myjfm/archive/2011/10/26/159093.aspx select()函数和poll()函数均是主要用来处理多路I/O复用的情况 ...

  7. Handlebars模板引擎之高阶

    Helpers 其实在Handlebars模板引擎之进阶我想说if else的功能的,可是由于这个功能在我的开发中我觉的鸡肋没啥用,就直接不用了. 因为if else只能进行简单判断,如果条件参数返回 ...

  8. C#-MVC开发微信应用(2)--微信消息的处理和应答

    微信应用使用场景和商机很多,所以这也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为SNF完善的必要条件了.本系列文章希望从一个循序渐进的角度上,全面介绍微信的相关开发过程和相关经验 ...

  9. Atitit 大json文件的结构化查看解决方案,高性能的jsonview  attilax总结.docx

    Atitit 大json文件的结构化查看解决方案,高性能的jsonview  attilax总结.docx 1.1. 实现目标:1 1.2. 实现key与value类型的..一直分析到非 jsonob ...

  10. [svc]find+xargs/exec重命名文件后缀&文件操作工具小结

    30天内的文件打包 find ./test_log -type f -mtime -30|xargs tar -cvf test_log.tar.gz awk运算-解决企业统计pv/ip问题 find ...