numpy.stack(axis=) 理解

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不变

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值