• numpy:维度问题


    浅谈NumPy中的维度Axis

    NumPy中的维度是一个很重要的概念,很多函数的参数都需要给定维度Axis,如何直观的理解维度呢?我们首先以二维数组为例进行说明,然后推广到多维数组。

    (有人将ndim属性叫维度,将axis叫轴,我还是习惯将axis称之为维度,axis=0称为第一个维度)

    二维数组的列子

    import numpy as np
    x = np.random.randint(0, 9, (2, 3))
    x
    Out[4]: 
    array([[6, 5, 2],
           [0, 6, 7]])
    x.ndim
    Out[5]: 2
    x.shape
    Out[6]: (2, 3)
    x[0]
    Out[7]: array([6, 5, 2])
    x[:, 0]
    Out[8]: array([6, 0])
    x.sum(axis=0)
    Out[9]: array([ 6, 11,  9])
    x.sum(axis=1)
    Out[10]: array([13, 13])

    看上面这个例子,x是一个2行3列的数组,所以x是一个二维数组。

    从第6和第7个输入输出,我们可以肯定地说"对于二维数组,第一维指的是行,第二维指的是列"。

    我们通过sum求和函数,探究一下x的第一维和第二维的意义?从第8个和第9个输入输出,我们可以看到对于参数axis=0,其结果是数组列的和;而对于参数axis=1,其参数是数组行的和。

    对于axis=0第一个维度求和,不是将第一维度(行)中的所有元素相加,而是沿着第一个维度,将对应其他维度(列)的数据相加,分解开来就是第10个输入输出。同理,对于axis=1,是沿着列,将行中的元素相加。

    NumPy中对于维度的操作都是以类似这样的逻辑操作的。

    所以,我的结论就是:在概念上维度是从整体到局部看的,最外围的是第一个维度,然后依次往里,最内部的就是最后一维。

    np.stack

    numpy.stack(arrays, axis=0)
    沿着新轴连接数组的序列。
    axis参数指定新轴在结果尺寸中的索引。例如,如果axis=0,它将是第一个维度,如果axis=-1,它将是最后一个维度。

    参数: 数组:array_like的序列每个数组必须具有相同的形状。axis:int,可选输入数组沿其堆叠的结果数组中的轴。
    返回: 堆叠:ndarray堆叠数组比输入数组多一个维。

    import numpy as np
    a = np.random.randint(0, 9, (2, 3))
    a
    Out[32]: 
    array([[0, 0, 4],
           [2, 4, 3]])
    b = np.stack([a, a], axis=0)
    b[0] == a
    Out[34]: 
    array([[ True,  True,  True],
           [ True,  True,  True]])
    b.shape
    Out[35]: (2, 2, 3)
    b = np.stack([a, a], axis=1)
    b.shape
    Out[37]: (2, 2, 3)
    b[:,0,:] == a
    Out[38]: 
    array([[ True,  True,  True],
           [ True,  True,  True]])
    b = np.stack([a, a], axis=2)
    b[: ,:, 0] == a
    Out[40]: 
    array([[ True,  True,  True],
           [ True,  True,  True]])
    b.shape
    Out[41]: (2, 3, 2)

    当从axis=0维度进行堆叠时,则a[i]相当于堆叠的第i个array

    当从axis=1维度进行堆叠时,则a[:,i,:]相当于堆叠的第i个array

    当从axis=2维度进行堆叠时,则a[:,:,i]相当于堆叠的第i个array。

    例如:

    当有(B, C)维度大小的arr需要对每一行的数据重复R次,生成(B,R,C)维度的数据时,就用

    np.stack([a] * R, axis=1)

    np.concatenate()

    numpy.concatenate((a1, a2, ...), axis=0)
    
    # 按维度拼接,如3x5的arr与5x5的矩阵拼接为8x5的矩阵
    a = np.zeros((3,4))
    b = np.ones((2, 4))
    c = np.concatenate([a, b], axis=0)
    c.shape
    Out[50]: (5, 4)
  • 相关阅读:
    java移位的具体应用
    mysql计划任务(轮询执行脚本)
    算法题(1)
    transient关键字及Serializable的序列化与反序列化
    java后台调用短信接口,实现发送短信验证码的控制层实现
    防卫导弹
    C++ STL
    字母转换
    三分·三分求极值
    各种数据类型取值范围
  • 原文地址:https://www.cnblogs.com/ziwh666/p/12398689.html
Copyright © 2020-2023  润新知