python数据分析进阶之numpy,,摘要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

相关内容

    暂无相关文章

评论关闭