zoukankan      html  css  js  c++  java
  • python数据分析进阶之numpy

    摘要

    Numpy是利用python来进行数据分析中必须要掌握的基础。是高性能科学计算和数据分析的基础包。利用numpy能对整组数据无需循环就能进行快速的标准数学函数计算,同时能进行线性代数,随机数,以及傅里叶变换等等功能,而对于数据分析来说,比较重要的用途就是数据的清理,过滤,子集构造,转换,排序,描述统计等等。

    创建多维数组

    1.利用array来生成基本数组,如:

    >>> import numpy as np

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

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

    2.利用shape来查看数组维度,如:

    >>> a.shape

    (4,)

    >>> b.shape

    (2, 3)

    a是4行的数组,b是一个2行3列的数组。

    3,利用zeros,ones,empty来创建全0,全1,没有任何具体值的数组,如:

    >>> np.zeros(10)

    array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

    >>> np.ones(5)

    array([ 1.,  1.,  1.,  1.,  1.])

    >>> np.empty(8)

    array([  1.42988904e-307,   1.42990941e-307,   1.42987885e-307,

             1.42991960e-307,   1.42988904e-307,   1.42992978e-307,

             1.42991960e-307,   1.42946125e-307])

    >>> np.zeros((3,2))

    array([[ 0.,  0.],

           [ 0.,  0.],

           [ 0.,  0.]])

    4,使用eye来创建对角矩阵,如:

    >>> np.eye(4)

    array([[ 1.,  0.,  0.,  0.],

           [ 0.,  1.,  0.,  0.],

           [ 0.,  0.,  1.,  0.],

           [ 0.,  0.,  0.,  1.]])

    5,利用arange来创建数组,如:

    >>> np.arange(10)

    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

    >>> np.arange(32).reshape((8,4))

    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],

           [24, 25, 26, 27],

           [28, 29, 30, 31]])

    数组与变量之间的运算

    数组与标量之间的运算,也会将变量值传播到各个原始,如:

    >>> a

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

    >>> a*2

    array([2, 4, 6, 8])

    >>> a**2

    array([ 1,  4,  9, 16])

    >>> a**0.5

    array([ 1.        ,  1.41421356,  1.73205081,  2.        ])

    数组访问

    1,下标从0开始,如:

    >>> a

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

    >>> a[0]

    1

    2,使用冒号来控制下标范围,冒号坐标是起始下标,后边是结束下标,如果左边没有,默认从0开始,如果右边没有,默认到最后一个,如:

    >>> a[1:3]

    array([2, 3])

    >>> a[:]

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

    >>> c

    array([[1, 2],

           [3, 4],

           [5, 6]])

    >>> c[0,1]

    2

    >>> c[:,:]

    array([[1, 2],

           [3, 4],

           [5, 6]])

    >>> c[1:,:]

    array([[3, 4],

           [5, 6]])

    数组函数运算

    1.一元运算符,接受一个或者多个标量值,返回一个或者多个变量值,如:

    >>> np.sqrt(a)

    array([ 1.        ,  1.41421356,  1.73205081,  2.        ])

    >>> np.exp(a)

    array([  2.71828183,   7.3890561 ,  20.08553692,  54.59815003])

    >>> np.log(a)

    array([ 0.        ,  0.69314718,  1.09861229,  1.38629436])

    >>> np.square(a)

    array([ 1,  4,  9, 16])

     

    2.数学以及统计方法

    可以通过数组上的一组(如一行,或者一列,或者所有元素)数据进行统计计算,如sum求和,mean平均值,std标准差等:

    >>> np.mean(c)

    3.5

    >>> np.sum(c)

    21

    >>> np.std(c)

    1.707825127659933

    或者接受某一行,某一列的运算,通过参数axis=1(行)或者axis=0(列)来控制,如:

    >>> c.mean(1)

    array([ 1.5,  3.5,  5.5])

    >>> c.mean(0)

    array([ 3.,  4.])

     

    线性代数

    1.利用dox进行矩阵相乘,如

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

    >>> a

    array([[5, 7, 2],

           [1, 4, 3]])

    >>> b=np.ones(3)

    >>> b

    array([ 1.,  1.,  1.])

    >>> a.dot(b)

    array([ 14.,   8.])

    或者:

    >>> np.dot(a,b)

    array([ 14.,   8.])

    a是2*3数组,b是3*1数组,那么a.dot(b)显然就是2*1数组

    2.其他常见运算,如:

    Diag:以一维数组的形式返回方阵对角线元素,如:

    >>> np.diag(a)

    array([5, 4])

    trace:计算对角线之和,如

    >>> np.trace(a)

    9

    Eig:计算方阵的特征值以及特征向量(在进行求解PCA主成分分析的时候,有很大作用)

    Svd:计算奇异值分解(SVD)

    random随机函数

    1.normal产生正态(高斯)分布样本,如:

    >>> nor= np.random.normal(size=(4,4))

    >>> nor

    array([[ 1.82509434, -0.08174943, -0.03192186, -1.32022539],

           [ 0.5635118 , -0.01755259, -0.6218383 , -0.47245589],

           [ 0.65491108, -0.07561601, -0.77738699, -1.0271891 ],

           [ 0.00750912, -0.28588276,  0.04140614, -0.0730934 ]])

    2. rand产生均匀分布样本,如:

    >>> ran=np.random.rand(10)

    >>> ran

    array([ 0.05615543,  0.30253678,  0.05719663,  0.93391993,  0.56396041,

            0.88799492,  0.90171215,  0.99980605,  0.4308874 ,  0.75317069])

    或者创建4*4矩阵

    >>> np.random.rand(4,4)

    array([[ 0.6606665 ,  0.61180694,  0.80557148,  0.29191235],

           [ 0.45824131,  0.71035683,  0.64597049,  0.53813232],

           [ 0.19844871,  0.99582822,  0.66510914,  0.38786658],

           [ 0.22661631,  0.24502371,  0.29560581,  0.65864835]])

    3.uniform产生[0,1)的均匀分布值,如:

    >>> np.random.uniform(size=(4*4))

    array([ 0.08978688,  0.69810777,  0.60858528,  0.88008121,  0.42380056,

            0.6660461 ,  0.38487761,  0.89294656,  0.8344627 ,  0.33255587,

            0.15196568,  0.38325999,  0.76401535,  0.30862096,  0.83909417,

            0.88435482])

    矩阵mat

    Numpy函数库中存在两种不同的数据类型,矩阵matrix以及数组array,都可以用于处理行列表示的数字元素。但是在这两个数据类型上执行相同的数学运算可能得到不同的结果,一般来说如果说需要矩阵之间的一些运算,如求逆,矩阵相乘,转置等,可以先转换为mat矩阵在进行。

    1.使用mat()可以把array转换为矩阵,如:

    >>> np.mat(a)

    matrix([[5, 7, 2],

            [1, 4, 3]])

    2.转换为mat之后,两个矩阵可以直接运算,如:

    相乘*

    >>> mat_a=np.mat(a)

    >>> mat_a

    matrix([[5, 7, 2],

            [1, 4, 3]])

    >>> mat_b=np.mat(b)

    >>> mat_b

    matrix([[ 1.,  1.,  1.]])

    >>> mat_b.T

    matrix([[ 1.],

            [ 1.],

            [ 1.]])

    >>> mat_b=mat_b.I

    >>> mat_a*mat_b

    matrix([[ 14.],

            [ 8.]])

    3,通用函数在array以及在mat上面返回的结果都是一样的,如:

    >>> mat_a

    matrix([[5, 7, 2],

            [1, 4, 3]])

    >>> mat_a.sum()

    22

    >>> mat_a.sum(1)

    matrix([[14],

            [ 8]])

    >>> mat_a.mean(0)

    matrix([[ 3. ,  5.5,  2.5]])

    >>> mat_a.mean(0).shape

    (1, 3)

    >>> mat_a.sum(1).shape

    (2, 1)

    扩展应用例子

    1.求一个向量inx与原始矩阵dataSet所有行的欧式距离(knn算法)

    >>> dataSet=np.array([[2,3,4,7,6], [4,3,4,5,7], [4,6,6,8,9], [2,3,6,1,6]])

    >>> inx=np.array([2,3,4,5,6])

    >>> rowSize=dataSet.shape[0]   #求出行数

    >>> diffMat=tile(inx,(rowSize,1))  #利用tile函数,把inx扩充为与dataset一样的维度,目的是为了矩阵相减

    >>> diffMat2=diffMat-dataSet

    >>> diffMat3=diffMat**2                #求欧式距离

    >>> diffMat4=diffMat3**0.5

    2.在Numpy中实现PCA主成分分析

    已知一个矩阵dataSet

    >>> dataSet

    array([[2, 3, 4, 7, 6],

           [4, 3, 4, 5, 7],

           [4, 6, 6, 8, 9],

           [2, 3, 6, 1, 6]])

    求出它的PCA,分为如下几个步骤:

    1)先求出每一列,也就是每个特征的平均值,axis=0表示列,axis=1表示行

    >>> meanVals=np.mean(dataSet,axis=0)

    2)原始矩阵去平均化

    >>> meanRemove = dataSet-meanVals

    3)求出去平均化后的矩阵的协方差矩阵

    >>> covMat=np.cov(meanRemove, rowvar=0)

    4)求出协方差矩阵的特征值以及特征向量,利用numpy库里面的eig函数

    >>> eigVals,eigVects=np.linalg.eig(np.mat(covMat))

    >>> eigVals

    array([  1.20374494e+01,   3.44539806e+00,   1.01715252e+00,

            -1.59662646e-16,   1.21625562e-16])

    >>> eigVects

    matrix([[ 0.20502268,  0.21893499, -0.80686681,  0.45018645, -0.41478476],

            [ 0.32626948,  0.5145318 ,  0.23557446, -0.33467377, -0.45542834],

            [-0.03039502,  0.57264251,  0.43491946,  0.64725395, -0.0675817 ],

            [ 0.86497081, -0.39326712,  0.20883181,  0.21575132, -0.02252723],

            [ 0.32002433,  0.4524887 , -0.24638376, -0.46887027,  0.78451505]])

    5)求出topN(假设为3)大的特征值以及对应的特征向量

    >>> eigValInd=np.argsort(eigVals)

    >>> eigValInd

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

    >>> eigValInd=eigValInd[:-(3+1):-1]

    >>> eigValInd

    array([0, 1, 2])                         #TOPN的值对应的下标为0,1,2

    >>> redEigVects=eigVects[:,eigValInd]  #TOPN特征值对应的特征向量组成的矩阵

    >>> redEigVects

    matrix([[ 0.20502268,  0.21893499, -0.80686681],

            [ 0.32626948,  0.5145318 ,  0.23557446],

            [-0.03039502,  0.57264251,  0.43491946],

            [ 0.86497081, -0.39326712,  0.20883181],

            [ 0.32002433,  0.4524887 , -0.24638376]])

    上面生成的redEigVect矩阵就是我们需要的PCA,也就是把5个特征变成了3个特征,实现了降维。假设原先的特征为x1,x2,x3,x4,x5,那么进行PCA转换后,新的三个变量分别为:

    Y1=0.20502268*X1+ 0.32626948*x2+-0.03039502*x3…..

    Y2=0.21893499*X1+…..

    Y3= -0.80686681*X1+…….

  • 相关阅读:
    Note:《Microsoft Windows Workflow Foundation 入门:开发人员演练》
    泛型集合类型,赋予集合业务意义,增强集合的抽象使用
    IIS7.0 for developer
    【代码保留】成对值类(PairCollection和Pair
    《SOA中国路线图》下载
    【代码保留】Quarter类
    复合控件和事件(6)——一点优化
    全方位掌握 NSIS 的使用[转]
    HTML Entities Examples
    如何对Outlook添加右键菜单
  • 原文地址:https://www.cnblogs.com/crespohust/p/5936470.html
Copyright © 2011-2022 走看看