首页 > 代码库 > python数据分析进阶之numpy

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+…….

python数据分析进阶之numpy