Python-03 ~ 机器学习库 之 NumPy

NumPy是机器学习中最常用的计算科学库,今天就来看看吧

NumPy简单介绍

  • NumPy的简单介绍:
    1. NumPy是机器学习中一个数据分析的核心基础库;
    2. NumPy中最核心的数据类型就是NumPy数组(类似于MatLab中的矩阵),要求这个数组中的数据的数据类型必须保持一致;
    3. 底层使用C、C++,Forturn语言实现,所以运算的效率是非常高的;
  • NumPy的主要内容:
    1. NumPy数组的初始化;
    2. 花式索引,即高阶数组索引;
    3. 随机数组的生成

NumPy数组的使用:

  1. NumPy数组的初始化:同一个NumPy数组中数据的数据类型最好保持一致:

    • 1维数组:
      import numpy as np
      arr1 = np.array([1, 2, 3, 4, 5]) # type(arr1)=numpy.ndarray(n dimension array)
      arr2 = np.array((1, 2, 3, 4, 5))
      
      • 即使使用元组的方式创建一个数组,那么最终会自动转化成列表的形式
    • 2维数组:
      import numpy as np
      arr1 = np.array(<list>) 
      arr2 = np.array(<list>)
      
    • 初始化的时候给定数据类型
      arr = np.array(<list>, dtype=int) 
      
      • 其中dtype可以是:bool,int,float,str,np.float32,np.float64,np.int32,np.int64···
      • 生成一个新的数组返回
    • 使用已经存在的NumPy数组初始化一个新的NumPy数组
      arr = np.asarray(<nd-array>[, dtype=<data-type>]) 
      
      • 如果<nd-array>和dtype都是一样的,就不会生成一个新的NumPy数组
    • 使用astype生成新的NumPy数组
      arr = <nd-array>.astype(<type>) 
      
    • 生成全0/1的NumPy数组
      arr = <nd-array>.zeros/ones(<shape>) 
      
      • 这里的<shape>本质上就是一个n维元组,而且这个元组的括号必须带上
    • 按照区间与步长结合生成NumPy数组
      arr = np.arange([<start>, ]<end>[, <step>]) 
      
      • 需要知道的是这个arange方法支持浮点数的生成
      • arange生成也是前闭后开的
    • 按照区间与生成个数结合生成NumPy数组
      arr = np.linespace([<start>, ]<end>[, <shape>]) 
      
      • linespace生成也是前闭后也是闭的
      • <shape>默认是50
    • 随机生成数组
      arr = np.random.rand(<shape>) # 均匀分布
      arr = np.random.randn(<shape>) # 高斯分布
      
  2. NumPy数组的运算:

    • 给ndarray的每个元素加一个数字a
      arr = <nd-array> + a
      
      • 列表是不支持这个列表+数字操作的;
    • 两个维度一样的ndarray相加:
      arr = <nd-array1> + <nd-array2>
      
      • 列表支持列表+列表的操作,其结果就是把两个列表的一级元素重新组合成一个新的列表;而两个维度一样的ndarray相加的结果就是这两个数组对应位置的数字相加形成新的数组,维度与其父母保持一致;
    • 给ndarray的每个元素乘以一个数字a:
      arr = <nd-array> * a
      
      • 列表是支持这个列表*数字操作,其结果就是a个列表相加的结果,而NumPy数组与一个数字相乘的结果是这个NumPy数组的每个元素乘以这个数字得到的结果;
    • 两个维度一样的ndarray相乘:
      arr = <nd-array1> + <nd-array2>
      
      • 列表不支持支持列表*列表的操作;而两个维度一样的ndarray相乘的结果就是这两个数组对应位置的数字相乘形成新的数组,维度与其父母保持一致;
  3. NumPy数组的常用属性、方法:

    • 获取NumPy数组的行列数:
      <nd-array>.shape
      np.shape(<list>/<scalar>)
      
    • 获取NumPy数组的维数:
      <nd-array>.ndim
      
      • 当参数为<scalar>的时候,返回的结果是一个空元组;
    • 获取NumPy数组中数据的数据类型:
      <nd-array>.dtype
      
    • 获取NumPy数组中每个元素个数 ???高维???:
      <nd-array>.size
      np.size(<list>)
      
    • 获取NumPy数组中每个元素所占字节数:
      <nd-array>.itemsize
      
    • 获取NumPy数组所占字节数:
      <nd-array>.nbytes
      
    • 替换NumPy中的元素为一个新值:
      <nd-array>.fill(<new-value>)
      
    • 如果NumPy数组中的元素为一个虚数,获取其实部和虚部:
      <nd-array>.imag
      <nd-array>.real
      
    • 特殊值:无穷大和不是一个数字:
      np.inf # 无穷大
      np.nan # 不是一个数字
      
    • 特殊值:无穷大和不是一个数字:
      np.inf # 无穷大
      np.nan # 不是一个数字
      
    • NumPy数组求和:
      1. 全部的和
        <nd-array>.sum()
        
      2. 所有列的和
        <nd-array>.sum(axis=0)
        
      3. 所有行的和
        <nd-array>.sum(axis=1)
        
    • NumPy数组求积:
      <nd-array>.prod([axis=<num>])
      
    • NumPy数组最小值:
      <nd-array>.min([axis=<num>])
      
    • NumPy数组求最大值:
      <nd-array>.max([axis=<num>])
      
    • NumPy数组求每行(1)/列(0)最大值的位置:
      <nd-array>.argmax([axis=<num>])
      
    • NumPy数组求每行(1)/列(0)最小值的位置:
      <nd-array>.argmax([axis=<num>])
      
    • NumPy数组求平均值:
      <nd-array>.mean([axis=<num>])
      
    • NumPy数组的转置:
      <nd-array>.T
      
  4. 索引和切片

    • 索引和切片的方式和列表用法一样,也有不一样的地方:
      1. 使用列表的方式访问多维数组
        <nd-array>[<dimension1>, <dimension2>, ...]
        
      2. 获取二维数组的第n列数据
        <nd-array>[:, n]
        
      3. 给已有的二维数组<nd-array>添加维度:
        <nd-array>[:, :, None]
        
      4. 花式索引(Fancy Indexing):一次性从nd-array中根据索引获取多个值
        // TODO
        
  5. NumPy数组的遍历:

    • 普通的遍历
      for ele in <nd-array>:
          <for-body>
      
    • n维NumPy数组全元素遍历:
      for idx, ele in np.ndenumerate<nd-array>:
          <for-body>
      
  6. 两个NumPy数组的拼接:

    • 使用concatenate行(axis=0)/(axis=0)列拼接:
      np.concatenate(<nd-array1>, <nd-array2>, [axis=<axis-value>])
      
      • 注意,两个数组进行拼接的时候需要注意:若进行拼接,则列数必须相等,列拼接行数则必须相等;
    • 使用vstack(行:垂直拼接)/hstack(列:水平拼接)拼接:
      np.vstack(<nd-array1>, <nd-array2>) # 类似SQL中的 union
      np.hstack(<nd-array1>, <nd-array2>) # 类似SQL中的join
      np.dstack(<nd-array1>, <nd-array2>) # 结果是一个三维的变化结果,后面有时间讲解
      
  7. NumPy数组的数学运算:

    • NumPy数组的普通运算:
      <nd-array1> +/-/*///**/% <num>
      
    • NumPy数组作为矩阵的乘法:
      <nd-array1>.dot(<num>/<nd-array2>)
      <nd-array1> @ (<num>/<nd-array2>) # 与.dot的结果一样,Python3以后支持
      
    • NumPy数组的一些数学函数:
      np.cos(<nd-array>)
      np.cos(<nd-array>)
      np.aqrt(<nd-array>)
      ...
      
      • 注意, math模块的函数是无法直接作用于NumPy数组的
  8. NumPy数组的逻辑运算:

    • NumPy数组的普通逻辑运算:
      <nd-array1> >/>=/</<= <num>
      
      • 注意,逻辑运算的结果是一个数组,不能直接结合if使用,但是可以通过一些函数如:if np.all/any/allclose(<nd-array-logic-expression>)这种方式使用;
  9. NumPy数组的广播机制:

    • 目前还不是很明白,研究明白之后补吧
      // TODO 
      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容