本文分了两部分,第一部分讲讲axis参数的理解,第二部分从np.stack函数的应用来反向理解该函数究竟干了些什么。

1.np.stack()中axis参数的深入理解

看了一下大家关于np.stack()的理解,我感觉自己还是一知半解,有点蒙。自己又想把这个函数搞明白 ,于是花了一点时间终于对这个函数有了自己的理解,决定把自己的想法写下来与大家分享,希望对大家有帮助。
stack为堆叠的意思,这个函数主要有两个参数,第一个是需要堆叠的多个数组,采用列表的形式输入,例如:np.stack([arrays1,array2,array3],axis=0)。第二个参数是axis,这个参数表示从哪一个维度进行堆叠以及堆叠的内容,这个维度是相对于堆叠的数组来说的。整个函数的输出为一个新数组。
下面以三维输出为例来谈谈我的理解。
先定义3个3*4的数组用来进行堆叠,注意进行堆叠的数组形式必须一致,在这里全为3×4:

a=np.array([i for i in range(12)]).reshape(3,4)
b=np.array([i for i in range(12,24)]).reshape(3,4)
c=np.array([i for i in range(24,36)]).reshape(3,4)

其结果为:

a= [[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]
b= [[12 13 14 15][16 17 18 19][20 21 22 23]]
c= [[24 25 26 27][28 29 30 31][32 33 34 35]]

来看看axis=0时,它是如何进行堆叠的:

new_array=np.stack([a,b,c],axis=0)
print(new_array)
#输出结果为:
[[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]][[24 25 26 27][28 29 30 31][32 33 34 35]]]

axis为0,表示它堆叠方向为第0维,堆叠的内容为数组第0维的数据。前面说了第0维是相对于堆叠的数组而言的,而这里数组的第0维其实就是整个3×4的数组(其中第1维为行,第2维为某一行中的一个值,这里有一个层层深入的感觉),所以就是以整个3×4的数组为堆叠内容在第0维上进行堆叠,等到的结果就是一个3×3×4的新数组。再通俗一点,就是将a,b,c分别作为堆叠内容进行堆叠得到3×3×4的输出。

再来看看axis=1的时候:

new_array=np.stack([a,b,c],axis=1)
print(new_array)
#输出结果为:
[[[ 0  1  2  3][12 13 14 15][24 25 26 27]][[ 4  5  6  7][16 17 18 19][28 29 30 31]][[ 8  9 10 11][20 21 22 23][32 33 34 35]]]

和刚才的解释一样,axis为1表示堆叠的方向为3×4数组的第1维(行),堆叠内容也为3×4数组的第1维的数据。而3×4的数组的第1维就是它的行,以数组a为例,它的堆叠数据分别是[0 1 2 3],[ 4 5 6 7],[ 8 9 10 11]。所以a,b,c三个数组在第1维上堆叠后的结果就是上面的输出结果。

当axis=2时,表示堆叠内容是3×4数组的第二维的数据(数组中某一行的某个值),堆叠方向为第二维(也就是先补全某一行)。对于数组a,第2维的第一个值为0,b为12,c为24,所这三个值组成堆叠后的新数组的一行,以此类推,最终可以得到下面的输出结果。

new_array=np.stack([a,b,c],axis=2)
print(new_array)
[[[ 0 12 24][ 1 13 25][ 2 14 26][ 3 15 27]][[ 4 16 28][ 5 17 29][ 6 18 30][ 7 19 31]][[ 8 20 32][ 9 21 33][10 22 34][11 23 35]]]

2.np.stack()的应用

现在假设我有一个3×3×4的数组a:

[[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]][[24 25 26 27][28 29 30 31][32 33 34 35]]]

另外假设:

x=a[0,:,:]
y=a[1,:,:]
z=a[2,:,:]

如果我们想用x,y,z来重新拼成数组a,就可以利用stack函数来实现:

s=np.stack([x,y,z],axis=0)
print(s)
#结果等于数组a
[[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]][[24 25 26 27][28 29 30 31][32 33 34 35]]]

再假设:

x=a[:,:,0]
y=a[:,:,1]
z=a[:,:,2]
r=a[:,:,3]

同样的,这里的数组a被分成了四个低维的元数组x,y,z,r。如果想用这四个元数组拼成原数组a我们可以这样做:

s=np.stack([x,y,z,r],axis=2)
print(s)
[[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]][[24 25 26 27][28 29 30 31][32 33 34 35]]]

希望这个思路能有助于大家更好理解。

np.stack()函数详解相关推荐

  1. np.stack()函数详解 ==>堆叠 【类似于torch.stack()】

    目录 1.来看看axis=0时,它是如何进行堆叠的:(按矩阵进行堆叠) 2.再来看看axis=1的时候:(按行进行堆叠) 3.当axis=2时(按列的的元素进行堆叠,先堆叠三个矩阵的第0个元素0,12 ...

  2. Python先生,你好!(6)——np.random函数详解

    Python先生,你好!(6)--np.random函数详解 (一)前 言 (二)常用方法 (1)np.random.rand() (2)np.random.randn() (3)np.random. ...

  3. 协方差矩阵数学原理,numpy计算协方差矩阵(np.cov)函数详解与源码剖析

    协方差矩阵详解以及numpy计算协方差矩阵(np.cov) 协方差矩阵详解 均值,标准差与方差 由简单的统计学基础知识,我们有如下公式: X ˉ = ∑ i = 1 n X i n \bar X{\r ...

  4. ndarray维度认识及np.concatenate函数详解

    https://blog.csdn.net/kealennieh/article/details/82464665 np.stack() 因为stack()函数会先把参数arrays中的每个元素变成n ...

  5. 【知识点】Python 的np.prod函数详解

    np.prod是Numpy库中的一个函数,全称为numpy.prod,它的作用是计算数组中所有元素的乘积.该函数是一个快速的计算积的方法,可以接收任意数组或矩阵作为输入,并返回这些数字的乘积. 举个例 ...

  6. np.cross函数详解

    numpy.cross Reference: Official Document of Numpy 语法 numpy.cross(a, b, axisa=-1, axisb=-1, axisc=-1, ...

  7. Python 中np.prod函数详解

    官方文档,输入a是数组,返回指定轴上的乘积,不指定轴默认是所有元素的乘积. 默认全部元素相乘,123*4=24 axis =0是按列乘, axis = 1是按行乘.

  8. pytorch函数详解

    pytorch函数详解 在typora这里写之后复制到简书上 1. torchvision 1.1 transforms.Compose(transforms) 把几个转换组合 example: fr ...

  9. blankcount函数python,Python pandas常用函数详解

    本文研究的主要是pandas常用函数,具体介绍如下. 1 import语句 2 文件读取 df = pd.read_csv(path='file.csv') 参数:header=None 用默认列名, ...

  10. python中transpose函数_对numpy中的transpose和swapaxes函数详解

    transpose() 这个函数如果括号内不带参数,就相当于转置,和.T效果一样,而今天主要来讲解其带参数. 我们看如下一个numpy的数组: `arr=np.arange(16).reshape(( ...

最新文章

  1. [译]Kotlin + buildSrc:更好的管理Gadle依赖
  2. 德国小哥1人“黑掉”谷歌地图:99部手机就能造成交通拥堵
  3. Struts2 标签配置详细
  4. python猜数字循环_python-练习实现猜数字的循环
  5. 液晶电视服务器无响应时间,液晶电视响应速度时间是多少更好啊?
  6. 大厂程序员辞职创业,赚的还没原来多!
  7. Flutter基础—开发环境与入门
  8. python语句分号_python 为什么不用分号作终止符?
  9. 微信小程序用RSA加密和java后台对接。
  10. mysql_store_result和mysql_use_result
  11. 二战十大致命武器之“喷火”式战斗机
  12. java解析xml方法_详解Java解析XML的四种方法
  13. 完整版JavaWeb环境搭建-maven-servlet...与测试,欢迎大家一起学习
  14. 关于LocalDateTime的全局返回时间带“T“的时间格式处理
  15. 广州大学2021计算机组成原理课程设计实验报告
  16. WARN Error while fetching metadata with correlation id 1 : {first=LEADER_NOT_AVAILABLE} (org.apache.
  17. iOS开发实现资源包增量更新
  18. sql between包括两端吗?
  19. C/C++常见面试知识点总结附面试真题----20220326更新
  20. cut the rope HTML 5版本背后的开发故事

热门文章

  1. html语言判断水仙花数,水仙花数判断讲解
  2. 基于STM32+华为云IOT设计的云平台监控系统
  3. VS2019配置WinPcap开发
  4. c语言学习体会300字,大一个人总结自我评价300字_大学生学年自我鉴定评价
  5. TCP传输慢问题分析
  6. 外贸常用术语_常用贸易术语大全
  7. 2021虫虫百度域名URL批量采集工具【自动去重】
  8. Centos7安装SCL源
  9. 静态IP、动态IP、ADSL拨号和DNS这几者你分得清吗?
  10. Java判断奇数和偶数。