a=np.array([i for i in range(20)]).reshape(4,5)
b=np.array([i for i in range(20,40)]).reshape(4,5)
c=np.array([i for i in range(40,60)]).reshape(4,5)
new_array=np.stack([a,b,c],axis=2)
print([a,b,c])
print(new_array)
print(new_array.shape)
[array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]]), array([[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29],
[30, 31, 32, 33, 34],
[35, 36, 37, 38, 39]]), array([[40, 41, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]])]
[[[ 0 20 40]
[ 1 21 41]
[ 2 22 42]
[ 3 23 43]
[ 4 24 44]]
[[ 5 25 45]
[ 6 26 46]
[ 7 27 47]
[ 8 28 48]
[ 9 29 49]]
[[10 30 50]
[11 31 51]
[12 32 52]
[13 33 53]
[14 34 54]]
[[15 35 55]
[16 36 56]
[17 37 57]
[18 38 58]
[19 39 59]]]
(4, 5, 3)
axis可取0,1,2。此处取2就是在第三个维度上进行堆叠,原“数组”为3个4行5列的数组。在第三个维度,即列上堆叠的过程:取每个数组的第一行的第一列的元素放一起,因为有3个数组,所以得到长度为3的列表【0,20,40】。接着取每个数组的第一行的第二列的元素放一起,得到【1,21,41】。接着依次将每个数组第一行的5列元素都取过之后得到5个长度为3的列表,或者说形状为(5,3)的数组:
[[ 0 20 40]
[ 1 21 41]
[ 2 22 42]
[ 3 23 43]
[ 4 24 44]]
照样再取第二行,形状为(5,3)的数组,4行都取完后,得到4个形状为(5,3)的数组。即形状为(4,5,3)的数组。
若axis=1,则在“行”维度上堆叠,将一行作为一个整体,首先取3个数组的第一行放一起得到
[[ 0 1 2 3 4]
[20 21 22 23 24]
[40 41 42 43 44]]
接着每个数组的第二、三、四行,最终得到形状为(4,3,5)的数组
[[[ 0 1 2 3 4]
[20 21 22 23 24]
[40 41 42 43 44]]
[[ 5 6 7 8 9]
[25 26 27 28 29]
[45 46 47 48 49]]
[[10 11 12 13 14]
[30 31 32 33 34]
[50 51 52 53 54]]
[[15 16 17 18 19]
[35 36 37 38 39]
[55 56 57 58 59]]]
之前axis=2时,没有以每一列作为一个整体,是因为列的维度“低于”行,只能先按行取列。
关于变换后的形状,经过观察对四维数组的变换过程,得到如下结论:
原数组形状为(x1,x2,x3…xn)时,若axis=x(t),则变换后形状为(x(t),x1,x2,x3…x(t-1),x(t+1),x(t+2)…xn)。即t之后维度值保持不变,t及t之前的维度值,进行循环变换1位。
例如 原属组(3,4,5,6,7) axis=4 得(4,5,6,7,3);axis=3 得(4,5,6,3,7);axis=2 得(4,5,3,6,7);axis=1 得(4,3,5,6,7);axis=0不变