python np.stack()函数原理详细分析

本文详细介绍了numpy库中的stack函数,主要用于数组的维度堆叠。stack函数接受两个参数,数组列表和axis参数,axis指定沿哪个维度进行堆叠。通过示例展示了在一维和二维数组上的堆叠效果,包括axis=0(行堆叠)、axis=1(列堆叠)和axis=2(元素堆叠)。文章还提供了官方API链接以及多个代码实例,帮助理解stack函数的工作原理。
摘要由CSDN通过智能技术生成

零、描述分析

这个函数主要有两个参数,第一个是需要堆叠的多个数组,注意进行堆叠的数组形式必须一致。例如:np.stack([arrays1,array2,array3],axis=0)。第二个参数是axis,这个参数表示从哪一个维度进行堆叠以及堆叠的内容,这个维度是相对于堆叠的数组来说的。

问题1:stack的本质作用是在干什么?stack为堆叠的意思,它的本质是在给数组升维。

问题2:np.stack([])中和其他函数相比为什么里面多了一个中括号?[]表示了传入的数组采用列表的形式输入。整个函数的输出为一个新数组。

问题3:axis=0,axis=1,axis=2,…axis=-1,axis去不同值时的含义是什么?不同的维度的数组axis可取的值不同,如一维时可取axis=0,axis=1,二维时axis=0,axis=1,axis=2,三维…以此类推。axis=0表示是堆叠的是数组整体,例如一维数组它的整体就是行就是按行进行堆叠,一个3×4的二维数组的整体就是整个3×4的数组就是将每个3×4的数组整体进行堆叠。axis=1表示的就是数组最高维的下一维,例一维就表示的是每一个元素,二维表示的就是行。axis=2以此类推,表示二维数组的元素三位数组的行,更高维数组以此类推。

看图进行更直观的理解:
a = np.array([[1,2],[3,4],[5,6]])
a = np.array([[1,2],[3,4],[5,6]])
b = np.array([[10,20],[30,40],[50,60]])
b = np.array([[10,20],[30,40],[50,60]])
a、b进行axis=0维堆叠
在这里插入图片描述
进行axis=1维堆叠
在这里插入图片描述
进行axis=2维堆叠
在这里插入图片描述
小规律:n个变量在x维堆叠(axis=x),则堆叠产生的新变量的第x维的维数为n;或者说,新变量的shape值为原shape值在第x位插入数字n。

一、先来看看官方API函数说明

传送门:https://numpy.org/doc/stable/reference/generated/numpy.stack.html
在这里插入图片描述
首先可以看出stack原型设置的axis=0,所以如果不设置axis的话默认axis=0

二、代码实例分析(stack堆叠一维数组)

定义两个1*16的二维数组用来进行堆叠,注意进行堆叠的数组形式必须一致。

x = np.array([i for i in range(16)])
y = np.array([i for i in range(16, 32)])
print(x)
print(y)

输出结果:

[ 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]
a = np.stack([x, y], axis=0)
b = np.stack([x, y], axis=1)

结果:

axis=0时第一个一维数组就是2×16二维数组的第一行(块)、第二个一维数组就是2×16二维数组的第二块

axis=1时第个一维数组的第一个元素就是二维数组的第一行第一个元素、第个一维数组的第一个元素就是二维数组的第一行的第二个元素构成二维数组的第一行(块),第个一维数组的第二个元素就是二维数组的第二行的第一个元素、第个一维数组的第二个元素就是二维数组的第二行的第二个元素构成二维数组的第二行****(块)

[[ 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]]
[[ 0 16]
 [ 1 17]
 [ 2 18]
 [ 3 19]
 [ 4 20]
 [ 5 21]
 [ 6 22]
 [ 7 23]
 [ 8 24]
 [ 9 25]
 [10 26]
 [11 27]
 [12 28]
 [13 29]
 [14 30]
 [15 31]]

三、代码实例分析(首先stack堆叠二维数组)

定义三个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)

结果:

[[ 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]]
a_ = np.stack([a, b, c], axis=0)
b_ = np.stack([a, b, c], axis=1)
c_ = np.stack([a, b, c], axis=2)
d_ = np.stack([a, b, c], axis=-1)

结果:

[[[ 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时二维数组整体堆叠,顺序:第一个3×4数组就是三维数组里的第一块,第二个3×4数组第二块…

[[[ 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数组的第一行、第二个3×4数组的第一行、第三个3×4数组的第一行时三维数组里的第一块,第一个3×4数组的第二行…

[[[ 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=2时按每个元素一次堆叠,顺序:第个3×4数组的元素是三维数组里的第一块第一行第一个元素第二个3×4数组的第一行的第一个元素是三维数组里的第一块的第一行的第二个元素、第个3×4数组的第一行的第一个元素是三维数组里的第一块的第一行的第三个元素组成三维数组里的第一块的第一行,第个3×4数组的第一行的第二个元素是三维数组里的第一块的第二行的第一个元素

[[[ 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]]]

axis=-1就是该数组的最后一维,在这个数组里面就是等同于axis=2

[[[ 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]]]

参考:
https://blog.csdn.net/weixin_44201525/article/details/109769214
https://blog.csdn.net/yuguo0_331/article/details/107929921?spm=1001.2014.3001.5506

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值