首页 > 代码库 > 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