Numpy最全介绍!!!建议收藏!!!(一)

Numpy最全介绍!!!建议收藏!!!(一)

写在前面:

Numpy包提供了大量的库函数和操作,其内置的库函数比python内置函数要快许多,这也是为什么numpy会大量用于数据分析和机器学习领域。同时,在学习过程中要善于使用help()函数来学习一种函数的具体使用方法

安装:

cmd中通过pip install numpy安装。

数组:

numpy 中数组的使用和python中的列表十分相似。但又与之有所不同

  1. numpy中的数组
    import numpy as np
    
    # python中的列表中的元素可以是不同数据类型的
    a = [1, 2.3, '4']
    print(a)
    
    # numpy中的数组的数据类型一定是全部相同的
    b = np.array([4, 5, 6.0])
    print(b)
    # 
    # [1, 2.3, '4']
    # [4. 5. 6.]
    
  2. 创建数组
    import numpy as np
    
    # 1. 使用np.array来创建数组
    a = np.array([1, 2, 3, 4])
    print(a)
    # [1 2 3 4]
    
    # 2. 使用np.arange创建数组
    b = np.arange(0, 10, 2)
    print(b)
    # 在0,10(不包含10,)范围内创建步长为2的一维数组
    # [0 2 4 6 8]
    #
    # 使用help函数查看np.arange()
    # help(np.arange)
    
    # 3.使用np.random.random来随机创建一个m行n列的数组,其中里面的值是0~1之间的随机数
    c = np.random.random((2, 3))
    print(c)
    # [[0.37130822 0.3524612  0.97197089]
    #  [0.43064737 0.53399519 0.26157308]]
    
    
    # 4.np.random.randint来随机创建一个m行n列的整形数组,其中里面的值的范围是0~10(不包含10,)
    d = np.random.randint(0, 10, size=(2, 3))
    print(d)
    # [[5 1 6]
    #  [5 2 1]]
    
    # 5.特殊函数
    # 1.生成所有元素都是0的3行3列的二维数组
    a1 = np.zeros((3, 3))
    print(a1)
    # 2.生成值全为1的3行3列的矩阵
    a2 = np.ones((3, 3))
    print(a2)
    # 3.生成值全部为9的2行3列的矩阵
    a3 = np.full((2, 3), 9)
    print(a3)
    # 4.生成对角线上全是1,其余地方全是0的矩阵
    a4 = np.eye(4)
    print(a4)
    # [[1. 0. 0. 0.]
    #  [0. 1. 0. 0.]
    #  [0. 0. 1. 0.]
    #  [0. 0. 0. 1.]]
    
  3. ndarray常用属性
    1. array.dtype

      numpy中数组只能储存一种数据类型,因此可以通过 array.dtype 获取数组中的元素的数据类型。numpy中的数据类型非常多,这使得它能够以尽量少的空间处理大量的数据。下面列出了array.dtype中常用的数据类型

      数据类型描述唯一标识符
      bool用一个字节存储的布尔类型(True或False)‘b’
      int8一个字节大小,-128 至 127‘i1’
      int16整数,16 位整数(-32768 ~ 32767)‘i2’
      int32整数,32 位整数(-2147483648 ~ 2147483647)‘i4’
      int64整数,64 位整数(-9223372036854775808 ~ 9223372036854775807)‘i8’
      uint8无符号整数,0 至 255‘u1’
      uint16无符号整数,0 至 65535‘u2’
      uint32无符号整数,0 至 2 ** 32 - 1‘u4’
      uint64无符号整数,0 至 2 ** 64 - 1‘u8’
      float16半精度浮点数:16位,正负号1位,指数5位,精度10位‘f2’
      float32单精度浮点数:32位,正负号1位,指数8位,精度23位‘f4’
      float64双精度浮点数:64位,正负号1位,指数11位,精度52位‘f8’
      complex64复数,分别用两个32位浮点数表示实部和虚部‘c8’
      complex128复数,分别用两个64位浮点数表示实部和虚部‘c16’
      object_python对象‘O’
      string_字符串‘S’
      unicode_unicode类型‘U’
      import numpy as np
      
      # 1.默认的数据类型
      a1 = np.arange(10)
      print(a1)
      print(a1.dtype)
      # [0 1 2 3 4 5 6 7 8 9]
      # int32
      # windows系统默认是int32,mac或者linux根据实际系统判断
      
      # 2.指定dtype
      b = np.array([1, 2, 3, 4, 5], dtype='i1')
      # b=np.array([1,2,3,4,5],dtype=np.int8)
      print(b)
      print(b.dtype)
      # [1 2 3 4 5]
      # int8
      
      # 3.修改dtype
      a2 = a1.astype(np.int64)
      print(a2)
      print(a2.dtype)
      # [0 1 2 3 4 5 6 7 8 9]
      # int64
      # astype不会修改数组本身而是将修改后的结果返回
      
      
    2. ndarray.size

      获取数组中总的元素个数。

      import numpy as np
      
      #获取二维数组a中的元素个数
      a = np.array([[1, 2, 3], [4, 5, 6]])
      print(a.size)
      
    3. ndarray.ndim

      获取数组的维度

      import numpy as np
      
      a1=np.array([1,2,3])#一维
      print(a1.ndim)
      a2=np.array([[1,2,3],[4,5,6]])
      print(a2.ndim)#二维
      a3=np.array([
          [
              [1,1,1],
              [2,2,2]
          ],
          [
              [3,3,3],
              [4,4,4]
          ]
      ])
      print(a3.ndim)#三维
      # 1
      # 2
      # 3
      
    4. ndarray.shape

      获取数组维度的元组

      import numpy as np
      
      a1 = np.array([1, 2, 3])
      print(a1.shape)
      a2 = np.array([[1, 2, 3], [4, 5, 6]])
      print(a2.shape)
      a3 = np.array([
          [
              [1, 1, 1],
              [2, 2, 2]
          ],
          [
              [3, 3, 3],
              [4, 4, 4]
          ]
      ])
      print(a3.shape)
      # (3,)
      # (2, 3)
      # (2, 2, 3)
      # #
      
      

      使用reshape 重新修改数组的维度

      import numpy as np
      
      a1 = np.array([1, 2, 3])
      a2 = np.array([[1, 2, 3], [4, 5, 6]])
      a3 = np.array([
          [
              [1, 1, 1],
              [2, 2, 2]
          ],
          [
              [3, 3, 3],
              [4, 4, 4]
          ]
      ])
      # 将a3修改成2行6列的二维数组,并拷贝到a4
      a4 = a3.reshape((2, 6))
      print(a4)
      print(a4.shape)
      
      # a5 = a3.reshape((1, 12))
      # a5 = a3.reshape((12))
      a5 = a3.flatten()  # 使用flatten函数快速将多维数组以行排序转换到一维数组
      print(a5)
      print(a5.ndim)
      
      # reshape将修改后的结果返回,并不会改变原来的数组。而resize可以修改原来的数组
      
    5. ndarray.itemsize

      获取数组中每个元素所占的字节数

      import numpy as np
      
      a = np.array([1, 2, 3], dtype=np.int64)
      print(a.itemsize)
      # 8
      
  4. Numpy数组操作
    • 数组索引和切片
      import numpy as np
      
      # 1、一维数组的索引和切片
      a1 = np.arange(10)
      print(a1[4])  # 4
      # 获取下标为4的元素
      print(a1[4:6])  # [4 5]
      # 切片:取从下标为4开始的元素到下标为6的元素(不包含6)
      print(a1[::2])  # [0 2 4 6 8]
      # 在所有范围内以步长为2取元素值
      print(a1[-1])  # 9
      # 取倒数第一个数
      
      print("+++++++++++++++++++++++++++++++++++++")
      # 多维数组
      a2 = np.random.randint(0, 10, size=(4, 6))
      print(a2)
      # [[2 1 1 1 6 0]
      #  [8 9 5 4 8 8]
      #  [4 3 6 1 7 2]
      #  [7 3 2 9 2 0]]
      print("+++++++++++++++++++++++++++++++++++++")
      print(a2[0])  # 取下标为0的行
      # [2 1 1 1 6 0]
      print(a2[0:2])  # 取下标为0,1的行
      # [[2 1 1 1 6 0]
      # [8 9 5 4 8 8]]
      print(a2[[0, 2, 3]])  # 取下标为0,2,3的行组成新的矩阵
      # [[2 1 1 1 6 0]
      # [4 3 6 1 7 2]
      # [7 3 2 9 2 0]]
      print(a2[[1, 2], [4, 5]])  # 取下标为(1,4)、(2,5)的元素值
      # [8 2]
      print(a2[1:3, 4:6])  # 取第2、3行和第5、6列重叠的元素
      # [[8 8]
      # [7 2]]
      
      

      一般来说,数组索引中逗号前面的元素范围就是行的范围,逗号后面的元素范围就是列的范围

    • 布尔索引
      import numpy as np
      
      a1=np.arange(24).reshape((4,6))
      print(a1)
      #把a1中元素小于10的找出来并置为True,否则置为False
      print(a1<10)
      #取a1中小于10的元素并置为一维数组
      print(a1[a1<10])
      # 取a1中小于5或大于10的元素并置为一维数组
      print(a1[(a1<5)|(a1>10)])
      
    • 值的替换
      import numpy as np
      
      a1 = np.random.randint(0, 10, size=(3, 5))
      print(a1)
      # 将行下标为1的行替换
      a1[1] = np.array([1, 2, 3, 4, 5])
      print(a1)
      # 将数组中元素小于3的数置为1
      a1[a1 < 3] = 1
      print(a1)
      #将a3中大于3的元素置为0,否则置为1
      a2 = np.where(a1 < 3, 0, 1)
      print(a2)
      
      

      例题:有一个8行9列的数组,请将其中1-5行(包含第5行)的第8列大于3的数全部都取出来。

      import numpy as np
      
      b = np.random.randint(0, 10, size=(8, 9))
      print(b)
      # 先获取指定部分的数据条件的数组
      conditions = b[1:6, 8] > 3
      print(conditions)
      # 再获取指定部分的数据
      datas = b[1:6, 8]
      print(datas)
      # 再从数组中提取符合条件的数据
      ans = datas[conditions]
      print(ans)
      
      
  5. 数组的广播机制
    import numpy as np
    
    a1 = np.random.randint(0, 5, size=(3, 5))
    print(a1)
    
    # 将a1中每个元素值都*2
    print(a1 * 2)
    a2 = np.random.randint(0, 5, size=(3, 5))
    
    # 将a1,a2各个元素对应相加
    # 注意:只有行数和列数分别相等的两个矩阵才能进行加减运算
    print(a1 + a2)
    
    # 将列向量a3加到a1的第一列
    a3 = np.random.randint(0, 5, size=(3, 1))
    print(a3 + a1)
    
    # 将行向量a4加到a1的第一行
    a4 = np.random.randint(0, 5, size=(1, 5))
    print(a4 + a1)
    
    #广播原则:
    # 如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。
    a5 = np.random.randint(0, 5, size=(3, 8, 2))
    a6 = np.random.randint(0, 5, size=(8, 2))
    print(a5)
    print("++++++++++++++++++++++++++++++++++")
    print(a6)
    print("++++++++++++++++++++++++++++++++++")
    print(a6 + a5)
    
    
  6. 数组形状的操作

    flattenravel函数:

    import numpy as np
    
    a1 = np.random.randint(0, 10, size=(3, 4)).reshape((2, 6))
    print(a1)
    a1.resize((4, 3))
    print(a1)
    
    
    # flatten和ravel函数
    a2 = np.random.randint(0, 10, size=(3, 4))
    print(a2)
    
    #flatten是将数组转换为一维数组后,然后将这个拷贝返回回去,所以后续对这个返回值进行修改不会影响之前的数组。
    a3=a2.flatten()
    a3[0]=100
    print(a2[0,0])
    #8
    
    # ravel是将数组转换为一维数组后,将这个视图(可以理解为引用)返回回去,所以后续对这个返回值进行修改会影响之前的数组。
    a4=a2.ravel()
    a4[0]=100
    print(a2[0,0])
    #100
    

    不同数组的组合:通过vstackhstack以及concatenate将多个数组叠加到一起

    import numpy as np
    
    #np.vstack将两个列数相同的数组按照垂直方向进行叠加
    vstack1=np.random.randint(0,10,size=(3,4))
    vstack2 = np.random.randint(0,10,size=(2,4))
    # vstack3=np.vstack([vstack1,vstack2])
    vstack3=np.concatenate([vstack1,vstack2],axis=0)#这里的axis将在之后讲到
    print(vstack3)
    print("="*30)
    
    #np.hstack将两个行数相同的数组按照水平方向进行叠加
    h1=np.random.randint(0,10,size=(3,4))
    h2=np.random.randint(0,10,size=(3,1))
    # h3=np.hstack([h1,h2])
    h3=np.concatenate([h1,h2],axis=1)
    print(h3)
    

    数组的切割:通过hsplitvsplit以及split将一个数组进行切割。

    import numpy as np
    
    sp1 = np.random.randint(0, 10, size=(3, 4))
    print(sp1)
    # [[9 9 8 7]
    #  [6 5 4 5]
    #  [1 7 4 3]]
    
    
    # 将sp1数组按照竖直方形进行切割,切成两部分,在水平方向上形成2个数组
    print(np.hsplit(sp1, 2))
    # [array([[9, 9],
    #        [6, 5],
    #        [1, 7]]), array([[8, 7],
    #        [4, 5],
    #        [4, 3]])]
    
    # 在下标为1和2的那一列前面切一刀,形成3个数组
    print(np.hsplit(sp1,(1,2)))
    # [array([[9],
    #        [6],
    #        [1]]), array([[9],
    #        [5],
    #        [7]]), array([[8, 7],
    #        [4, 5],
    #        [4, 3]])]
    print("=*"*30)
    vs1 = np.random.randint(0,10,size=(4,5))
    print(vs1)
    # [[7 8 8 0 9]
    #  [9 7 9 6 2]
    #  [4 3 5 1 5]
    #  [7 9 0 0 4]]
    
    
    print(np.vsplit(vs1,4))
    # [array([[7, 8, 8, 0, 9]]), array([[9, 7, 9, 6, 2]]), array([[4, 3, 5, 1, 5]]), array([[7, 9, 0, 0, 4]])]
    
    print(np.vsplit(vs1,(1,3)))
    # [array([[7, 8, 8, 0, 9]]), array([[9, 7, 9, 6, 2],
    #        [4, 3, 5, 1, 5]]), array([[7, 9, 0, 0, 4]])]
    
    #使用split函数进行切割
    print(np.split(sp1,4,axis=1))
    #axis=1表示按列进行切割,axis=0表示按行进行切割
    print(np.split(vs1,4,axis=0))
    
  7. 矩阵转置和轴对换
    
    import numpy as np
    
    t1=np.random.randint(0,10,size=(2,4))
    print(t1)
    #t1的转置,不会影响到原来数组
    print(t1.T)
    #此外,还可以使用transpose方法进行转置,不过transpose会影响到原来的数组
    t2=t1.transpose()
    t2[0]=100
    print(t1)
    #求矩阵内积
    print(t1.dot(t1.T))
    

写在最后。。。。。。

​ 你们的鼓励是我输出的动力,这是Numpy 的数组操作,在我主页还有Numpy 的文件操作,赶快点赞收藏吧!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值