008.np.expand_dims&高维度的vstack

np.expand_dims:字面意思,增加维度

先认识一下维度的概念:以下给出了一个array,其shape=(2, 3, 2, 3),如何看array的维度呢?有几层中括号,维度就是几。从最外面的中括号开始看,第0维是看第一个中括号,其中包含两个部分,所以大小是2;第1维就是看第二层括号,其中包含了三小项,所以大小是3;依次类推。该矩阵来源

np.array(
  [
      [
          [
           [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,36]
          ]
      ]
  ]).shape

接下来比较立体的解释一下:

import numpy as np
x = np.arange(1,7).reshape(2,3)
np.expand_dims(x,axis=0)
np.expand_dims(x,axis=1) # 表示增加第二个维度(第二层中括号),也就是第1维(因为从0开始表示)
np.expand_dims(x,axis=-1) # 表示最后增加一个维度,当然此处可以写2
# x初始状态是两个维度的,x.ndim=2
x:array([[1, 2, 3],
         [4, 5, 6]])
x.shape = (2, 3)
# 增加第一维
x_expand_axis0:array([[[1, 2, 3],
        	            [4, 5, 6]]])
x_expand_axis0.shape = (1, 2, 3)
# 增加第二维
x_expand_axis1:array([[[1, 2, 3]],
                       [[4, 5, 6]]])
x_expand_axis1.shape = (2, 1, 3)
# 增加第三维
x_expand_axis2:array([[[1],
                        [2],
                        [3]],
                       [[4],
                        [5],
                        [6]]])
x_expand_axis2.shape = (231)    

其实可以将你想要增加维度的数组直接用reshape也可以产生同样的效果。

x = np.arange(1,7).reshape(2,3)
x = np.expand_dims(x,axis=-1)

就等同于:

x = np.arange(1,7).reshape(2,3,1)

最后,学习知乎上的一种理解方式,在坐标轴上立体的表示数据:

比如shape = (2,3)的数据表示在一个二维坐标轴中,如图:

shape = (2, 3, 1)的数据相当于在z轴的高度是1,如图:(从左往右是x轴方向,从下往上是y轴方向,不会画图,自行体会,可以自己在本子上画一画加深理解)

36
25
14

vstack,今天一个高维度的堆叠把我整乱了,各种试,以下是成果:

在二维堆叠中,vstack是沿着垂直方向上堆叠,其实就是行数增加了。

a = np.arange(6).reshape(3,2)
np.vstack(a).shape # (3,2)
np.hstack(a).shape # (6,)
# 首先创建一个优雅的高维度list,按照上面的方法,你一定很容易的得出该list的shape了
a = [
    	[
            [
                [1,2,3],
                [4,5,6]
            ],
            [
                [1,2,3],
                [4,5,6]
            ]
        ],
    	[
            [
                [1,2,3],
                [4,5,6]
            ],
            [
                [1,2,3],
                [4,5,6]
            ]
        ],
    	[
            [
                [1,2,3],
                [4,5,6]
            ],
            [
                [1,2,3],
                [4,5,6]
            ]
        ]
    ]
# 把list转为numpy的array,并查一下shape=(3, 2, 2, 3)
a = np.asarray(a)
# a.shape
# 然后np.vstack(a)是哪一维度堆叠呢?查一下他的shape=(6,2,3)
b = np.vstack(a)
# np.vstack(a).shape
"""
array([[[1, 2, 3],
        [4, 5, 6]],

       [[1, 2, 3],
        [4, 5, 6]],

       [[1, 2, 3],
        [4, 5, 6]],

       [[1, 2, 3],
        [4, 5, 6]],

       [[1, 2, 3],
        [4, 5, 6]],

       [[1, 2, 3],
        [4, 5, 6]]])
"""
"""
分析:可以这么理解,堆叠前的a相当于是3个大块矩阵,这每一个大块的shape是(2,2,3),大块又是2个竖着的(2,3)小块,沿着垂直方向堆积,其实就是一坨一坨竖着放在一起
(2,3)
(2,3)
(2,3)
(2,3)
(2,3)
(2,3)
形成这样的矩阵,就是(6,2,3)了
""" 
# 多试几次就明白了,第一个维度其实都是竖着排列的,将后面用不着的维度都视作小块
a = np.arange(90).reshape(3,2,5,3)
np.vstack(a).shape # (6, 5, 3)
np.hstack(a).shape # (2, 15, 3)
"""
hstack
(5,3)(5,3)(5,3)
(5,3)(5,3)(5,3)
"""

还有一个奇怪的现象:就是外面又套了一层中括号,导致维度增加,我没发现

sum = []
a = np.arange(12).reshape(2,3,2)
sum.append(a)
sum.append(a)
np.asarray(a).shape # (2,2,3,2)

简单图示:就是说除了最右边那一维度(这里是5),其他维度都是竖着排列的,哈哈哈哈!能理解就行,徒步豪华:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值