目录
1.来看看axis=0时,它是如何进行堆叠的:(按矩阵进行堆叠)
3.当axis=2时(按列的的元素进行堆叠,先堆叠三个矩阵的第0个元素0,12,24,先堆叠三个矩阵的第1个元素1,13,25....)
numpy.stack(arrays, axis=0)
axis参数指定新轴在结果尺寸中的索引。例如,如果axis=0
,它将是第一个维度,如果axis=-1
,它将是最后一个维度。
- 参数: 数组:array_like的序列每个数组必须具有相同的形状。axis:int,可选输入数组沿其堆叠的结果数组中的轴。
- 返回: 堆叠:ndarray堆叠数组比输入数组多一个维。
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]]
1.来看看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的输出。
2.再来看看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维上堆叠后的结果就是上面的输出结果。
3.当axis=2时(按列的的元素进行堆叠,先堆叠三个矩阵的第0个元素0,12,24,先堆叠三个矩阵的第1个元素1,13,25....)
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]]]
表示堆叠内容是3×4数组的第二维的数据(数组中某一行的某个值),堆叠方向为第二维(要先补全某一行)。对于数组a,第2维的第一个值为0,b为12,c为24,所这三个值组成堆叠后的新数组的一行,以此类推,最终可以得到下面的输出结果。