零、描述分析
这个函数主要有两个参数,第一个是需要堆叠的多个数组,注意进行堆叠的数组形式必须一致。例如: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]])
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