my canteen
登录       注册

您现在的位置是:网站首页 > 学无止境

每日一技之numpy数组的属性与转置

王伟2020年4月5日168人围观
简介numpy数组的属性与转置

Numpy数组的基本操作

    # 用numpy构建简单数组
    import numpy as np
    x = np.arange(10)
    # res :
    # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    y = np.arange(15).reshape(3,5)
    # res :
    array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

Numpy的基本属性

    # ndim表示数组的维度
    x.ndim # res:1 (1维数组)
    y.ndim # res:2 (2维数组)
    # shape表示数组形状
    x.shape # res :(10,)
    y.shape # res :(3,5)
    # size表示数组元素的个数
    x.size # res : 10
    y.size # res : 15
    # 还包括之前说过的dtype 还有一些出现频率比较少的属性,如需要使用可查看文档

reshape的妙用

    # reshape的使用
    a = x.reshape(2,5)
    # a res:
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    # 我们再看一看x是否发生变化
    x
    # res : array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    # 由此可见reshape并没有修改x的内存
    # 但是通过reshape生成的新数组和原始数组公用一个内存,也就是说,假如更改一个数组的元素,另一个数组也将发生改变 
    a[0][0] = 10
    x
    # res : array([10, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    # 在reshape的使用中 我会经常使用-1
    y.reshape(-1,5)
    # res : 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    # 数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。
    # 如果我们想要得到一个一维的数组呢?
    # 我们可能想到reshape(1,-1)
    X.reshape(1,-1)
    # res :array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14]])
    X.reshape(1,-1).shape
    # res: (1, 15)
    # 为什么还是一个二维数组呢?原来是姿势不对
    X.reshape(-1,)
    # res :array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
    X.reshape(-1,).shape
    # res : (15,)
    # 是不是很神奇呢?我们可以自己多尝试尝试,没准就发现了新大陆

数组的转置T

数组的转置之前我们需要理解轴(axis)的概念

我们的数组有几个维度 也就对应到了几个轴 那四维的呢?当然可以,并且我很佩服有人能看到四维空间。

    # x res :
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    # y res :
    array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]]) 
    z = np.arange(24).reshape(2,3,4)
    # res :
    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]]])
    x.T
    # res :
    array([0,  1,  2,  3,  4,  5,  6,  7,  8,  9])
    # 一维数组的转置也是没有意义的
    y.T
    # 相信大家都应该学习过线性代数
    # res : 
    array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])
    # 同样我们也可以使用swapaxes(axis1,axis2)
    # axis1,axis2就是我们需要交换的轴
    y.swapaxes(0,1) # 结果相同
    # res :
    array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])
    # 但是我们不禁思考T明明可以做的事为什么再来一个swapaxes呢?
    # 再来看看我们的三维数组
    z.T
    # res :
    array([[[ 0, 12],
            [ 4, 16],
            [ 8, 20]], [[ 1, 13],
                        [ 5, 17],
                        [ 9, 21]],[[ 2, 14],
                                   [ 6, 18],
                                   [10, 22]], [[ 3, 15],
                                               [ 7, 19],
                                               [11, 23]]])
    # 但是z.T只能按照默认的0轴和2轴交换,也就是我们常说的z轴和y轴
    z.swapaxes(0,2)
    # res : # 结果同T转置一样,也就验证了T的转置方式
    array([[[ 0, 12],
            [ 4, 16],
            [ 8, 20]], [[ 1, 13],
                        [ 5, 17],
                        [ 9, 21]],[[ 2, 14],
                                   [ 6, 18],
                                   [10, 22]], [[ 3, 15],
                                               [ 7, 19],
                                               [11, 23]]])
    # 我们在测试一下其他的轴
    z.swapaxes(0,1)
    # res: # 结果又是这样的一种形式
    array([[[ 0,  1,  2,  3],
            [12, 13, 14, 15]],   [[ 4,  5,  6,  7],
                                  [16, 17, 18, 19]], [[ 8,  9, 10, 11],
                                                      [20, 21, 22, 23]]])
    # 但是swapaxes只能交换两个轴,但是三维甚至多维就不怎么实用了
    # 这样numpy又为我们提供了transpose(naxis)
    z.transpose(0,2,1)
    # res:
    array([[[ 0,  4,  8],
        [ 1,  5,  9],
        [ 2,  6, 10],
        [ 3,  7, 11]],

       [[12, 16, 20],
        [13, 17, 21],
        [14, 18, 22],
        [15, 19, 23]]])
    # 这样就可以实现多维数组的快速转置 是不是感觉numpy很贴心呢   

本来今天心血来潮想在复习一下numpy的运算,分割,合并。但是明显时间不够了!只能下次再复习了!

路漫漫其修远兮,吾将上下而求索。


文章评论

  • 测试 2020年4月13日 11:28

    你好啊

来说句话吧.... 共有评论数:1条


微信二维码 博主微信 qq二维码 博主QQ
177****8743
7*24小时电话