美文网首页机器学习与数据分析Pandas
Python机器学习及分析工具:Numpy篇

Python机器学习及分析工具:Numpy篇

作者: 殉道者之花火 | 来源:发表于2018-08-27 17:16 被阅读106次

      人工智能(Artificial Intelligence,AI)时代,简单易学,同时拥有着丰富模块库的Python成为时代的宠儿,活跃在人工智能的各个领域。我们可以借助Python库执行基本的机器学习任务。常用的Python科学库如下:

    • 矩阵函数操作库(Numpy)
    • 科学计算包(Scipy)
    • Python绘图库(Matplotlib)
    • 数据分析包(Pandas)
    • 机器学习函数库(Scikit-learn)
    • 统计建模工具包(StatsModels)
    • 深度学习框架(TensorFlow)

    Numpy

    Numpy即Numeric Python,是用来存储和处理大型多维矩阵的开源数值计算开源工具,由于机器学习算法在处理数据过程中大多涉及线性代数,需要用到矩阵的各种操作,故而,Numpy在机器学习领域有着较多的使用场景。


      Python语言提供数据类型列表(list)和array模块都可以当作数组使用。然而在处理数据过程中,我们一般不建议使用这两种方式,因为list的元素可以是任意对象,因此list中保存的是对象的指针,这样为了保存一个简单的[a,b],需要有2个指针和2个字符对象。对于大规模的数值运算来说,这种结构显然会对内存和CPU的性能造成极大的浪费。而array模块提供的array对象和列表不同,虽然可以直接保存数据,但由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。
      Numpy的出现弥补了这些不足,Numpy提供两种基本对象:
      ndarray(N-dimensional array object):存储单一数据类型的多维数组;
      ufunc(universal function object):对数组进行处理的函数;


    • 模块导入
    import numpy as np
    

    • 数组的创建方式
      1.将Python列表转换为数组

      np.array((1,2,3,4,5))
      

      2.将Python的range对象转换成数组

      np.array(range(5))
      

      3.创建一维数组

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

      4.创建二维数组

      np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15]])  # 3行5列
      

      5.生成等差数组

      np.linspace(1,5,5)     
      

      linspace(start,end,size):生成以start为首项,end为末项,项数为size的等差数组

      6.生成等比数组

      np.logspace(0,100,10)
      

      logspace(start,end,size):生成首项为0,末项为100,项数为size的等比数组

      7.创建全0二维数组

      np.zeros((3,3))
      

      8.创建全0一维数组

      np.zeros((3,1))
      

      7.创建全1二维数组

      np.ones((3,3))
      

      8.创建全1一维数组

      np.ones((3,1))
      

      8.创建全0二维数组

      np.zeros((3,3))
      

      9.创建单位矩阵

      np.identity(3)
      

      10.创建空数组

      np.empty((3,3))
      

      只申请空间而不初始化,元素值是不确定的
      11.使用arrange函数创建函数,类似于Python的range函数
      f = np.arrange(0,1,0.1)


    • 获取数组的属性值
      a.通过shape获取数组的大小

      arr = np.array([[1,2],[3,4]])
      arr.shape
      

      可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度,需要注意的是,只是改变了轴的大小,数组元素在内存中的位置并没有改变。

      当某个轴的值为-1时,将根据数组元素自动计算此轴的长度,如数组a是一个(3,4)的数组,若令a.shape=(2,-1),输出a.shape后发现轴的值改为(2,6)。

      b.使用数组的reshape方法,可以创建一个改变了尺寸的新数组,但是原数组的shape保持不变。

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

      显示结果如下:

      array([[1,2],[3,4]])
      

      使用reshape方法生成的新数组与原数组共享内存区域,因此修改其中任何一个数组元素的会同时修改另一个数组的内容。
      c.数组的类型
      通过数组的dtype属性获得数组的元素类型

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

      显示结果如下

      dtype('int32')
      

      可以通过dtype参数在创建数组时指定元素类型

      e = np.array([1,2,3,4],dtype = np.float)
      

      d.

    • 数组运算

      • 数组与数值的算术运算
          数组与数值的算术运算实质是数组中的元素与数值进行运算。
      • 数组与数组的算术运算
          数组与数组的算术运算实质也是数组元素之间进行运算
      a = np.array([1,2,3])
      b = np.array([[1,2,3],[4,5,6],[7,8,9]])
      c = a*b
      

      显示结果如下

      array([[1,4,9],[4,10,18],[7,16,27]])
      
      • Numpy使用arr.T实现二维数组转置,arr.dot()实现向量内积的计算,支持切片操作

    • Numpy常用函数
    ufunc manual
    round(_) 对元素进行四舍五入操作
    floor(x) 对数组x所有元素向下取整
    ceil(x) 对数组x所有元素向上取整
    sum(x,axis=arg) 不给出axis参数时,表示对数组所有元素求和;axis=0时,对数组纵向求和;axis=1时进行横向求和。
    mean(x,axis=arg) 返回数组元素算术平均值,axis参数的用法类似sum()
    max/min(x,axis=arg) 返回元素的最大/最小值,axis参数的用法同上
    std(x,axis=arg) 返回元素的标准差,axis参数的用法同上
    var(x,axis=arg) 返回元素的方差,axis参数的用法同上
    sort(x,axis=arg) 返回排序后的数组,axis参数的用法同上
    where(condition,x,y) 当只给出条件,未给出参数x,y时,则输出满足条件元素的坐标,坐标以tuple形式给出;当条件参数都给出时,满足条件,输出x,反之输出y。
    piecewise(x,condlist,funclist) 分段函数,参数x是一个保存自变量值的数组.condlist是一个长度为M的布尔数组列表,其中的每个布尔数组的长度都和数组x相同。funclist是一个长度为M或M+1的函数列表。

    分段函数示例:

    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    # 数组x的元素中,小于4的乘3,大于6的乘2,其余都为0
    np.piecewise(x, [x<4,x>6], [lambda x:x*3,lambda x:2*x])
    
    随机数生成函数 特征
    rand() 生成0~1之间的随机数
    randn() 生成服从标准正态分布的随机数
    uniform(x,y,num) 随机生成num个实数,它在 [x, y) 范围内
    randint(low, high,( shape)) 依shape创建随机整数或整数数组,范围是[ low, high) seed(s) :随机数种子
    shuffle(a) 根据数组a的第一轴进行随机排列,改变数组a
    permutation(a) 根据数组a的第一轴进行随机排列, 但是不改变原数组,将生成新数组
    choice(a[, size, replace, p]) 从一维数组a中以概率p抽取元素, 形成size形状新数组,replace表示是否可以重用元素,默认为False。

    更多函数请参考Numpy函数库



    • 广播(Broadcasting)
        我们讨论了许多数组之间的运算,但是显然,都是基于数组纬度一致的前提。当我们需要对两个纬度不同的数组进行运算时,就需要了解numpy中的广播机制。其实质就是将不同维度的数组转换维相同纬度在进行运算,在实际应用中许多基于网格或者基于网络的问题都需要使用广播。


      Broadcasting

      关于广播机制的详细讨论可以参考文章:
      广播(Broadcasting)
      Numpy二元运算的Broadcasting机制

    相关文章

      网友评论

        本文标题:Python机器学习及分析工具:Numpy篇

        本文链接:https://www.haomeiwen.com/subject/cofwiftx.html