【Python】—— Numpy 初体验

🌟欢迎来到 我的博客 —— 探索技术的无限可能!

🌟博客的简介(文章目录)

Numpy 初体验

      • 第1关:Numpy 创建数组
      • 第2关:Numpy 数组的基本运算
      • 第3关:Numpy 数组的切片与索引
      • 第4关:Numpy 数组的堆叠
      • 第5关:Numpy 的拆分

        第1关:Numpy 创建数组

        任务描述

        本关任务:使用 Numpy创建一个多维数组。

        相关知识

        为了完成本关任务,你需要掌握:创建数组。

        创建数组

        在 Python中创建数组有许多的方法,这里我们使用 Numpy中的 arange方法快速的新建一个数组:

        import numpy as np
        a = np.arange(5)
        

        其中 import numpy as np是指引入 Numpy这个库,并取别名为 np。之所以取别名,是为了代码编写的方便。a=np.arange(5) 是指将数值 0 1 2 3 4赋值给 a这个变量,这样我们就快速的创建了一个一维数组。

        创建多维数组的方法是:

        import numpy as np
        b = np.array([np.arange(6),np.arange(6)])
        

        这里,我们使用两个 arange方法,创建了两个 1x6的一维数组,然后使用 numpy的 array方法,将两个一维数组组合成一个 2x6的二维数组。从而达到了创建多维数组的目的。

        numpy 创建的数组可以直接复制,具体代码示例如下:

        import numpy as np
        x = [y for y in range(6)]
        b=np.array([x]*4)
        

        该段代码会创建一个 4*6的数组。

        编程要求

        本关的任务是,补全 Begin-End 内的代码,以实现创建一个 m*n的多维数组的功能。具体要求如下:

        • 函数接受两个参数,然后创建与之对应的的多维数组;

        • 本关的测试样例参见下文。

          本关设计的代码文件 cnmda.py的代码框架如下:

          # 引入numpy库
          import numpy as np
          # 定义cnmda函数
          def cnmda(m,n):
              '''
              创建numpy数组
              参数:
                   m:第一维的长度
                   n: 第二维的长度
              返回值:
                  ret: 一个numpy数组
              '''
              ret = 0
              
              # 请在此添加创建多维数组的代码并赋值给ret
              #********** Begin *********#
              #********** End **********#
              
              return ret
          

          测试说明

          本关的测试过程如下:

          • 平台运行 step1/cnmdatest.py 文件,并以标准输入方式提供测试输入;

          • cnmdatest.py文件调用 cnmda中的 cnmda方法,平台获取 cnmdatest.py的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。

            以下是平台对 step1/cnmdatest.py的测试样例:

            测试输入: 5 8;

            预期输出: (5,8)

            测试输入: 4 9;

            预期输出:(4,9)

            运行代码

            # 引入numpy库
            import numpy as np
            # 定义cnmda函数
            def cnmda(m,n):
                '''
                创建numpy数组
                参数:
                       m:第一维的长度
                       n: 第二维的长度
                返回值:
                    ret: 一个numpy数组
                '''
                
                ret = 0
                
                # 请在此添加创建多维数组的代码并赋值给ret
                #********** Begin *********#
                b=np.arange(n);
                ret=np.array([b]*m)   
                #********** End **********#
                
                return ret
            

            第2关:Numpy 数组的基本运算

            任务描述

            本关任务:学会 Numpy二维数组的一些基本操作。

            相关知识

            为了完成本关任务,你需要掌握:

            1. 向量与向量之间;
            2. 向量与标量之间。

              Numpy库可以直接进行一些四则运算,快速的处理两个 Numpy 数组:

            a = np.array([[1,2,3],[4,5,6]])
            b = np.array([[4,5,6],[1,2,3]])
            

            向量与向量之间

            1. 加法
            In:np.add(a,b) 或 a+b
            Out:array([[5, 7, 9],
                   [5, 7, 9]])
            
            1. 减法
            In:np.subtract(a,b) 或 a-b
            Out:array([[-3, -3, -3],
                   [ 3,  3,  3]])
            
            1. 乘法(X乘)
            In:np.multiply(a,b) 或 a * b
            Out:array([[ 4, 10, 18],
                   [ 4, 10, 18]])
            
            1. 乘法(点乘)
            a = np.array([[1,2,3],[4,5,6]])
            b = np.array([4,5,6])
            In: np.dot(a,b) 
            Out:array([32, 77])
            
            1. 除法
            a = np.array([[1,2,3],[4,5,6]])
            b = np.array([[4,5,6],[1,2,3]])
            In:np.divide(a,b) 或 a/b
            Out:array([[ 0.25,  0.4 ,  0.5 ],
                   [ 4.  ,  2.5 ,  2.  ]])
            

            向量与标量之间

            a = np.array([[1,2,3],[4,5,6]])
            
            1. 加法
            In:  a +1
            Out:array([[2, 3, 4],
                   [5, 6, 7]])
            
            1. 减法
            In:  a -1
            Out:array([[0, 1, 2],
                   [3, 4, 5]])
            
            1. 乘法
            In: a*2
            Out:array([[ 2,  4,  6],
                   [ 8, 10, 12]])
            
            1. 除法
            In: a/2
            Out:array([[ 0.5,  1. ,  1.5],
                   [ 2. ,  2.5,  3. ]])
            
            1. 求余
            In:a%2
            Out:array([[1, 0, 1],
                   [0, 1, 0]])
            
            1. 矩阵转置
            In:a.T
            Out:array([[1, 4],
                   [2, 5],
                   [3, 6]])
            
            1. 矩阵的逆

              矩阵可逆的充要条件是矩阵满秩。

            import numpy as np
            import numpy.linalg as lg
            a = np.array([[1,2,3],[4,5,6],[7,8,9]])
            In:lg.inv(a)
            Out:array([[  3.15251974e+15,  -6.30503948e+15,   3.15251974e+15],
                   [ -6.30503948e+15,   1.26100790e+16,  -6.30503948e+15],
                   [  3.15251974e+15,  -6.30503948e+15,   3.15251974e+15]])
            

            编程要求

            本关的任务是,补全代码,以实现向量与标量相加和相乘的的功能。具体要求如下:

            • 函数接受三个参数,然后进行向量与标量之间的运算;

            • 本关的测试样例参见下文;

            • 本关设计的代码文件 cal.py的代码框架如下:

              # 引入numpy库
              import numpy as np
              # 定义opeadd函数
              def opeadd(m,b,n):
                  '''实现加法
                  参数:
                  m:是一个数组
                  b:是一个列表
                  n:是列表中的索引
                  你需要做的是 m+b[n]
                  返回值:
                  ret: 一个numpy数组
                  '''    
                  ret = 0
                  # 请在此添加 创建多维数组 的代码 并赋值给ret
                  #********** Begin *********#
                  #********** End **********#
                  return ret
               # 定义opemul函数
              def opemul(m,b,n):
                  '''实现乘法
                  参数:
                  m:是一个数组
                  b:是一个列表
                  n:是列表中的索引
                  你需要做的是 m+b[n]
                  返回值:
                  ret: 一个numpy数组
                  '''
                  ret = 0
                  # 请在此添加 创建多维数组 的代码 并赋值给ret
                  #********** Begin *********#
                  #********** End **********#
                  return ret
              

              测试说明

              本关的测试过程如下:

              • 平台运行 step5/caltest.py文件,并以标准输入方式提供测试输入;

              • caltest.py文件调用 cal中的方法,平台获取 caltest.py的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。

                以下是平台对 step5/caltest.py的测试样例:

                a= np.array([[1,2,3],[4,5,6]])
                b = [1,2,3]
                

                测试输入: add;

                预期输出:

                [[2 3 4]
                 [5 6 7]]
                

                测试输入:mul;

                预期输出:

                [[ 2  4  6]
                 [ 8 10 12]]
                

                运行代码

                # 引入numpy库
                import numpy as np
                # 定义opeadd函数
                def opeadd(m,b,n):
                    '''
                    参数:
                    m:是一个数组
                    b:是一个列表
                    n:是列表中的索引
                    你需要做的是 m+b[n]
                    返回值:
                    ret: 一个numpy数组
                    '''    
                    ret = 0
                    #********** Begin *********#
                    ret=m+b[n]
                    #********** End **********#
                    return ret
                # 定义opemul函数
                def opemul(m,b,n):
                    '''
                    参数:
                    m:是一个数组
                    b:是一个列表
                    n:是列表中的索引
                    你需要做的是 m*b[n]
                    返回值:
                    ret: 一个numpy数组
                    '''
                    ret = 0
                    #********** Begin *********#
                    ret=m*b[n]
                    #********** End **********#
                    return ret
                

                第3关:Numpy 数组的切片与索引

                任务描述

                本关任务:从数组中选择指定的元素。

                相关知识

                为了完成本关任务,你需要掌握:数组的切片与索引。

                数组的切片与索引

                一维 Numpy数组的切片操作与 Python列表的切片一样。下面首先来定义数字 0``````1``````2 直到 8的数组,然后通过指定下标 3 到7 来选择数组的部分元素,这实际上就是提取数组中值为 3到6 的元素。

                In: import numpy as np
                In: a = np.arange(9)
                In: a[3:7]
                Out: array([3,4,5,6])
                

                同时用下标选择元素,下标范围从 0到 7,并且下标每次递增 2,如下所示:

                In: a[:7:2]
                Out:array([0,2,4,6])
                

                也可以像 Python数组一样,用负值下标来反转数组:

                In: a[::-1]
                Out: array([8,7,6,5,4,3,2,1,0])
                

                对于二维数组的索引,类似与 Python 数组的列表:

                In: a=np.array([[1,2,3],[4,3,2]])
                In: a[1][0] 
                Out:array([4])
                In:a[1,:2]    #获取第1维的前2个元素
                Out:array([4, 3])
                

                编程要求

                本关的任务是,补全代码,以实现 Numpy数组的索引功能的功能。具体要求如下:

                • 函数接受两个参数,然后返回切片找出的指定元素;
                • 本关的测试样例参见下文;
                • 本关设计的代码文件 ce.py的代码框架如下:
                  # 引入numpy库
                  import numpy as np
                  # 定义cnmda函数
                  def ce(a,m,n):
                      '''
                      参数:
                      a:是一个Numpy数组
                      m:是第m维数组的索引
                      n:第m维数组的前n个元素的索引
                      返回值:
                      ret: 一个numpy数组
                      '''
                      ret = 0
                      # 请在此添加切片的代码,实现找出多维数组a中第m个数组的前n个元素并赋值给ret
                      #********** Begin *********#
                      #********** End **********#
                      return ret
                  

                  测试说明

                  本关的测试过程如下:

                  • 平台运行 step2/cetest.py文件,并以标准输入方式提供测试输入;

                  • cetest.py文件调用 ce中的 ce方法,平台获取 cetest.py的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。

                  • 预处理的数组

                    [[1,2,3,4,5],[7,8,9,10,11],[12,13,14,15]]

                    以下是平台对 step2/cetest.py的测试样例:

                    测试输入:

                    1;

                    3;

                    预期输出:

                    [7,8,9]

                    测试输入:

                    2;

                    2;

                    预期输出:

                    [12,13]

                    运行代码

                    # 引入numpy库
                    import numpy as np
                    # 定义cnmda函数
                    def ce(a,m,n):
                        '''
                        参数:
                        a:是一个Numpy数组
                        m:是第m维数组的索引
                        n:第m维数组的前n个元素的索引
                        返回值:
                        ret: 一个numpy数组
                        '''
                        ret = 0
                        # 请在此添加切片的代码,实现找出多维数组a中第m个数组的前n个元素 并赋值给ret
                        #********** Begin *********#
                        ret=a[m,:n]
                        #********** End **********#
                        return ret
                    

                    第4关:Numpy 数组的堆叠

                    任务描述

                    本关任务:改变 Numpy数组的形状。

                    相关知识

                    为了完成本关任务,你需要掌握:

                    1. 改变数组形状;
                    2. 数组的堆叠。

                      使用 Numpy,我们可以方便的更改数组的形状,比如使用 reshape()、ravel()、flatten()、transpose() 函数等。

                      具体的使用如下:

                    改变数组形状

                    reshape()

                    import numpy as np
                    In: b = np.arange(24).reshape(2,3,4)
                    In: b
                    Out: 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]]])
                    

                    ravel()

                    拆解,将多维数组变成一维数组。

                    In:  b.ravel()
                    Out: 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])
                    

                    flatten()

                    拉直,其功能与 ravel() 相同,但是 flatten() 返回的是真实的数组,需要分配新的内存空间,而 ravel() 仅仅是改变视图。

                    In:  b.flatten()
                    Out: 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])
                    

                    shape()

                    使用元组改变数组形状。

                    In: b.shape = (6,4)
                    In: b
                    out: 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]])
                    

                    transpose()

                    转置。

                    In: b.transpose()
                    Out: array([[ 0,  4,  8, 12, 16, 20],
                           [ 1,  5,  9, 13, 17, 21],
                           [ 2,  6, 10, 14, 18, 22],
                           [ 3,  7, 11, 15, 19, 23]])
                    

                    数组的堆叠

                    从深度看,数组既可以横向叠放,也可以竖向叠放。因此,我们我们对数组进行堆叠,Numpy 数组对堆叠包含以下几个函数:

                    首先,创建两个数组。

                    In: a = np.arange(9).reshape(3,3)
                    In: a
                    Out: array([[0, 1, 2],
                           [3, 4, 5],
                           [6, 7, 8]])
                    In: b = a*2
                    In: b
                    Out: array([[ 0,  2,  4],
                           [ 6,  8, 10],
                           [12, 14, 16]])
                    

                    hstack()

                    水平叠加。

                    In: np.hstack((a,b))  # 注意 这里是两层括号
                    Out: array([[ 0,  1,  2,  0,  2,  4],
                           [ 3,  4,  5,  6,  8, 10],
                           [ 6,  7,  8, 12, 14, 16]])
                    

                    vstack()

                    垂直叠加。

                    In: np.vstack((a,b))
                    Out:array([[ 0,  1,  2],
                           [ 3,  4,  5],
                           [ 6,  7,  8],
                           [ 0,  2,  4],
                           [ 6,  8, 10],
                           [12, 14, 16]])
                    

                    dstack()

                    深度叠加。

                    In: np.dstack((a,b))
                    Out: array([[[ 0,  0],
                            [ 1,  2],
                            [ 2,  4]],
                           [[ 3,  6],
                            [ 4,  8],
                            [ 5, 10]],
                           [[ 6, 12],
                            [ 7, 14],
                            [ 8, 16]]])
                    

                    编程要求

                    本关的任务是,补全代码,分别实现 Numpy数组的垂直叠加、水平叠加、深度叠加。具体要求如下:

                    • 函数接受两个参数,然后将两个参数进行叠加;
                    • 本关的测试样例参见下文;
                    • 本关设计的代码文件 manipulation.py的代码框架如下:
                      # 引入numpy库
                      import numpy as np
                      # 定义varray函数
                      def  varray(m,n):
                          '''
                          参数:
                          m:是第一个数组
                          n:是第二个数组
                          返回值:
                          ret: 一个numpy数组
                          '''
                          ret = 0
                          # 请在此添加代码实现数组的垂直叠加 并赋值给ret
                          #********** Begin *********#
                          #********** End **********#
                          return ret
                      # 定义darray函数
                      def  darray(m,n):
                          '''
                          参数:
                          m:是第一个数组
                          n:是第二个数组
                          返回值:
                          ret: 一个numpy数组
                          '''
                          ret = 0
                          # 请在此添加代码实现数组的深度叠加并赋值给ret
                          #********** Begin *********#
                          #********** End **********#
                          return ret
                       # 定义harray函数
                      def  harray(m,n):
                          '''
                          参数:
                          m:是第一个数组
                          n:是第二个数组
                          返回值:
                          ret: 一个numpy数组
                          '''
                          ret = 0
                          # 请在此添加代码实现数组的水平叠加并赋值给ret
                          #********** Begin *********#
                          #********** End **********#
                          return ret
                      

                      测试说明

                      本关的测试过程如下:

                      • 平台运行 step3/manipulationtest.py文件,并以标准输入方式提供测试输入;

                      • manipulationtest.py文件调用 manipulation中的三个方法,平台获取 manipulationtest.py的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。

                      • 预处理数组:

                        a = np.array([[1,2,3],[4,5,6]])

                        b = np.array([[3,4,5],[7,8,9]])

                        以下是平台对 step3/manipulationtest.py的测试样例:

                        测试输入: v;

                        预期输出:

                        [[1 2 3]
                         [4 5 6]
                         [3 4 5]
                         [7 8 9]]
                        

                        测试输入: d;

                        预期输出:

                        [[[1 3]
                          [2 4]
                          [3 5]]
                         [[4 7]
                          [5 8]
                          [6 9]]]
                        

                        运行代码

                        # 引入numpy库
                        import numpy as np
                        # 定义varray函数
                        def  varray(m,n):
                            '''
                            参数:
                            m:是第一个数组
                            n:是第二个数组
                            返回值:
                            ret: 一个numpy数组
                            '''
                            ret = 0
                            # 请在此添加代码实现数组的垂直叠加并赋值给ret
                            #********** Begin *********#
                            ret=np.vstack((m,n))
                            #********** End **********#
                            return ret
                        # 定义darray函数
                        def  darray(m,n):
                            '''
                            参数:
                            m:是第一个数组
                            n:是第二个数组
                            返回值:
                            ret: 一个numpy数组
                            '''
                            ret = 0
                            # 请在此添加代码实现数组的深度叠加并赋值给ret
                            #********** Begin *********#
                            ret=np.dstack((m,n))
                            #********** End **********#
                            return ret
                         # 定义harray函数
                        def  harray(m,n):
                            '''
                            参数:
                            m:是第一个数组
                            n:是第二个数组
                            返回值:
                            ret: 一个numpy数组
                            '''
                            ret = 0
                            # 请在此添加代码实现数组的水平叠加并赋值给ret
                            #********** Begin *********#
                            ret=np.hstack((m,n))
                            #********** End **********#
                            return ret
                        

                        第5关:Numpy 的拆分

                        任务描述

                        本关任务:对 Numpy数组进行拆分。

                        相关知识

                        为了完成本关任务,你需要掌握:拆分数组。

                        使用 Numpy,我们可以方便的对数组进行拆分,比如使用 hsplit()、vsplit()、dsplit()、split() 函数等。

                        拆分数组

                        准备数组。

                        import numpy as np
                        In: a= np.arange(9).reshape(3,3)
                        In: a
                        Out: array([[0, 1, 2],
                               [3, 4, 5],
                               [6, 7, 8]])
                        

                        hsplit()

                        横向拆分。

                        In: np.hsplit(a,3)
                        Out:[array([[0],[3], [6]]), 
                            .  array([[1], [4],[7]]), 
                               array([[2],[5], [8]])]
                        

                        vsplit()

                        纵向拆分。

                        In: np.vsplit(a,3)
                        Out: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
                        

                        dsplit()

                        深度拆分。

                        深度拆分要求数组的秩大于等于 3。

                        c= np.arange(27).reshape(3,3,3)
                        In: np.dsplit(c,3)
                        Out:[array([[[ 0],
                                 [ 3],
                                 [ 6]],
                         
                                [[ 9],
                                 [12],
                                 [15]],
                         
                                [[18],
                                 [21],
                                 [24]]]), array([[[ 1],
                                 [ 4],
                                 [ 7]],
                         
                                [[10],
                                 [13],
                                 [16]],
                         
                                [[19],
                                 [22],
                                 [25]]]), array([[[ 2],
                                 [ 5],
                                 [ 8]],
                         
                                [[11],
                                 [14],
                                 [17]],
                         
                                [[20],
                                 [23],
                                 [26]]])]
                        

                        编程要求

                        本关的任务是,补全代码,分别实现 Numpy 数组的纵向拆分、横向拆分、深度拆分。具体要求如下:

                        • 函数接受一个参数,然后将数组进行拆分;
                        • 本关的测试样例参见下文;
                        • 本关设计的代码文件 splitarray.py的代码框架如下:
                          # 引入numpy库
                          import numpy as np
                          # 定义varray函数
                          def  vsarray(m,n):
                              '''
                              参数:
                              m:是第一个数组
                              n:是需要拆分到的维度
                              返回值:
                              ret: 一个numpy数组
                              '''
                              ret = 0
                              # 请在此添加代码实现数组的纵向拆分并赋值给ret
                              #********** Begin *********#
                              #********** End **********#
                              return ret
                             
                          # 定义hsarray函数
                          def  hsarray(m,n):
                              '''
                              参数:
                              m:是第一个数组
                              n:是需要拆分到的维度
                              返回值:
                              ret: 一个numpy数组
                              '''
                              ret = 0
                              # 请在此添加代码实现数组的水平拆分并赋值给ret
                              #********** Begin *********#
                              #********** End **********#
                              return ret
                           # 定义dsarray函数
                          def  dsarray(m,n):
                              '''
                              参数:
                              m:是第一个数组
                              n:是需要拆分到的维度
                              返回值:
                              ret: 一个numpy数组
                              '''
                              ret = 0
                              # 请在此添加代码实现数组的深度拆分并赋值给ret
                              #********** Begin *********#
                              #********** End **********#
                              return ret
                          

                          测试说明

                          本关的测试过程如下:

                          • 平台运行 step5/splitarraytest.py文件,并以标准输入方式提供测试输入;

                            -splitarraytest.py文件调用 splitarray中的三个方法方法,平台获取 splitarraytest.py的输出,然后将其与预期输出作对比,如果一致,则测试通过;否则测试失败。

                            • 预处理数组:

                              a= np.arange(9).reshape(3,3)

                              c = np.arange(27).reshape(3,3,3)

                              以下是平台对 step4/splitarraytest.py的测试样例:

                              测试输入: v;

                              预期输出: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

                              测试输入: h;

                              预期输出: [array([[0],[3],[6]]), array([[1],[4],[7]]), array([[2],[5],[8]])]

                              运行代码

                              # 引入numpy库
                              import numpy as np
                              # 定义varray函数
                              def  vsarray(m,n):
                                  '''
                                  参数:
                                  m:是第一个数组
                                  n:是需要拆分到的维度
                                  返回值:
                                  ret: 一个numpy数组
                                  '''
                                  ret = 0
                                  # 请在此添加代码实现数组的纵向拆分并赋值给ret
                                  #********** Begin *********#
                                  ret=np.vsplit(m,n)
                                  #********** End **********#
                                  return ret
                              # 定义darray函数
                              def  dsarray(m,n):
                                  '''
                                  参数:
                                  m:是第一个数组
                                  n:是需要拆分到的维度
                                  返回值:
                                  ret: 一个numpy数组
                                  '''
                                  ret = 0
                                  # 请在此添加代码实现数组的深度拆分并赋值给ret
                                  #********** Begin *********#
                                  ret=np.dsplit(m,n)
                                  #********** End **********#
                                  return ret
                               # 定义harray函数
                              def  hsarray(m,n):
                                  '''
                                  参数:
                                  m:是第一个数组
                                  n:是需要拆分到的维度
                                  返回值:
                                  ret: 一个numpy数组
                                  '''
                                  ret = 0
                                  # 请在此添加代码实现数组的水平拆分并赋值给ret
                                  #********** Begin *********#
                                  ret=np.hsplit(m,n)
                                  #********** End **********#
                                  return ret