第7讲Python可视化与机器学习库

• 1 Python中计算与可视化技术
• 2 维度数组与矩阵运算工具NumPy使用
• 3 SciPy科学计算工具箱及应用
• 4 高级绘图工具Matplotlib的应用
• 5 机器学习库Scikit-Learn的使用
 

• 用于Python科学计算与可视化的扩展模块主要有:
– NumPy、 SciPy、 SymPy、 matplotlib、 Traits、 TraitsUI、 Chaco、TVTK、 Mayavi、 VPython、 OpenCV。
• numpy:科学计算包,支持N维数组运算、处理大型矩阵、成熟的广播函数库、矢量运算、线性代数、傅里叶变换、随机数生成,并可与C++/Fortran语言无缝结合。
• scipy: scipy依赖于numpy,提供了更多的数学工具,包括矩阵运算、线性方程组求解、积分、优化等等。
• 大量科学计算库安装包下载:
http://www.lfd.uci.edu/~gohlke/pythonlibs/
• enthought科学计算解决方案: https://www.enthought.com/
 

1 numpy 应用
向量、矩阵大量的操作。

#科学计算可视化
#2 Numpy 
import numpy as np
a = np.array((1,2,3,4,5))
a

一定要关注版本。pip list  看Numpy的版本为多少。斯坦福第15或17,matlib的版本有差异,代码没问题。

pandas升级会升级Numpy

• 以下代码在chp07可视化脚本中。
• 导入模块
>>> import numpy as np
• 生成数组
>>> a = np.array((1,2,3,4,5))                             向量      
>>> b = np.array(([1,2,3],[4,5,6],[7,8,9]))          矩阵    
>>> x = np.linspace(0,5,10)                              0和5之间10等分
>>> x
array([ 0. , 0.55555556, 1.11111111, 1.66666667, 2.22222222,
2.77777778, 3.33333333, 3.88888889, 4.44444444, 5. ])
>>> y = np.logspace(0,100,10)
>>> y
array([ 1.00000000e+000, 1.29154967e+011, 1.66810054e+022,
2.15443469e+033, 2.78255940e+044, 3.59381366e+055,
4.64158883e+066, 5.99484250e+077, 7.74263683e+088,
1.00000000e+100])

• 数组与数值的运算
>>> a = a*2
>>> b = b/2.0
• 数组与数组的运算
>>>b = b+b
>>> a = np.array((1,2,3))
>>> b = np.array(([1,2,3],[4,5,6],[7,8,9]))
>>> c = a*b
>>> print( c)
[[ 1 4 9]
[ 4 10 18]
[ 7 16 27]]
>>> print( c/b)
[[1 2 3]
[1 2 3]
[1 2 3]]
转置
>>> b = np.array(([1,2,3],[4,5,6],[7,8,9]))
>>> print( b)
[[1 2 3]
[4 5 6]
[7 8 9]]
>>> print( b.T)
[[1 4 7]
[2 5 8]
[3 6 9]]
• 点积
>>> c = np.dot(a,b)
>>> print( c)
[30 36 42]
• 数组元素访问
>>> import numpy as np
>>> import scipy.signal as signal
>>> x = np.arange(0,100,10,dtype=np.floating)             使数据变为浮点数,所以下面数据会有.。其实是10.000
>>> x
array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90.])
>>> index = np.random.randint(0,len(x),5)
>>> index
array([9, 5, 9, 5, 6])
>>> noise = np.random.standard_normal(5)*0.3               normal就是正态分布的意思
>>> noise
array([ 0.07000973, 0.17404817, 0.16620985, 0.15281169, -0.08693726])
>>> x[index]
array([ 90., 50., 90., 50., 60.])
>>> x[index] += noise
>>> x[index]
array([ 90.16620985, 50.15281169, 90.16620985, 50.15281169, 59.91306274])
• 三角函数运算
>>> b = np.array(([1,2,3],[4,5,6],[7,8,9]))
>>> print( np.sin(b))
[[ 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 ]                                               R             回归(真实数据)
[ 0.6569866 0.98935825 0.41211849]]
• 四舍五入
>>> print( np.round(np.sin(b)))
[[ 1. 1. 0.]
[-1. -1. 0.]                                                                                                  C             分类
[ 1. 1. 0.]]

• 矩阵元素求和
>>> x = np.arange(0,10).reshape(2,5)                                             重新排队,变成2行5列
>>> x
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> np.sum(x)
45
>>> np.sum(x, axis=0)                                                                         按列求和
array([ 5, 7, 9, 11, 13])
>>> np.sum(x, axis=1)                                                                          按行求和
array([10, 35])
• 计算均值
>>> np.average(x, axis =0)
array([ 2.5, 3.5, 4.5, 5.5, 6.5])
>>> np. average(x,axis=1)
array([ 2., 7.])
• 计算标准差、方差
>>> x = np.random.randint(0,10,size=(3,3))
>>> x
array([[4, 2, 8],
[0, 8, 9],
[0, 2, 7]])
>>> np.std(x)                                       标准差
3.4029761846919007
>>> np.std(x,axis=1)
array([ 2.49443826, 4.02768199, 2.94392029])
>>> np.var(x)                                       方差
11.580246913580245
• 求最大值
>>> x
array([[4, 2, 8],
[0, 8, 9],
[0, 2, 7]])
>>> np.max(x)
9
>>> np.max(x,axis=1)
array([8, 9, 7])

• 排序
>>> x
array([[4, 2, 8],
[0, 8, 9],
[0, 2, 7]])
>>> np.sort(x)                               其实隐含 axis=1,默认安行排,及和 np.sort(x,axis=1)结果一样
array([[2, 4, 8],
[0, 8, 9],
[0, 2, 7]])
>>> np.sort(x,axis=0)
array([[0, 2, 7],
[0, 2, 8],
[4, 8, 9]])
• 生成特殊数组
>>> print( np.zeros((3,3)))
[[ 0. 0. 0.]
[ 0. 0. 0.]
[ 0. 0. 0.]]
>>> print( np.ones((3,3)))
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
>>> print( np.identity(3))
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
>>> np.empty((3,3))#只申请空间,不初始化,速度很快
array([[ 4.24510694e+175, 5.03061214e+223, 4.72100120e+164],
[ 2.63551414e-144, -1.00000000e+000, 0.00000000e+000],
[ 0.00000000e+000, 0.00000000e+000, 1.00000000e+000]])
• 改变数组大小
>>> a = np.arange(1,11,1)
>>> a
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> a.shape = 2,5
>>> a
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
>>> a.shape = 5,-1          #-1表示自动计算
>>> a
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
>>> b = a.reshape(2,5)
>>> b
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
• 切片操作
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
>>> a[::2]
array([0, 2, 4, 6, 8])
>>> a[:5]
array([0, 1, 2, 3, 4])
• 切片操作
>>> c
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
>>> c[0,3:5]                                       0代表第一行
array([3, 4])
>>> c[0]
array([0, 1, 2, 3, 4, 5])
>>> c[2:5,2:5]
array([[22, 23, 24],
[32, 33, 34],
[42, 43, 44]])
• 布尔运算
>>> x = np.random.rand(10)
>>> x
array([ 0.93874098, 0.97312716, 0.45264749, 0.74117525, 0.89758246,
0.29755703, 0.2182093 , 0.5673035 , 0.90745768, 0.71920431])
>>> x>0.5
array([ True, True, False, True, True, False, False, True, True, True],
dtype=bool)
>>> x[x>0.5]
array([ 0.93874098, 0.97312716, 0.74117525, 0.89758246, 0.5673035 ,
0.90745768, 0.71920431])
>>> np.array([1,2,3]) < np.array([3,2,1])
array([ True, False, False], dtype=bool)
>>> np.array([1,2,3]) ==np.array([3,2,1])
array([False, True, False], dtype=bool)

• 取整运算
>>> x = np.random.rand(10)*50
>>> x
array([ 0.69708323, 14.99931488, 15.04431214, 24.60547929,
12.12020273, 42.72638176, 16.01128916, 38.91558471,
39.6877989 , 21.98678429])
>>> np.array([t-int(t) for t in x])
array([ 0.69708323, 0.99931488, 0.04431214, 0.60547929, 0.12020273,
0.72638176, 0.01128916, 0.91558471, 0.6877989 , 0.98678429])
• 广播
>>> a = np.arange(0,60,10).reshape(-1,1)
>>> b = np.arange(0,6)
>>> a
array([[ 0],
[10],
[20],
[30],
[40],
[50]])
>>> b
array([0, 1, 2, 3, 4, 5])
>>> a+b
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
• 分段函数
>>> x = np.random.randint(0,10,size=(1,10))
>>> x
array([[0, 4, 3, 3, 8, 4, 7, 3, 1, 7]])
>>> np.where(x<5,0,1)
array([[0, 0, 0, 0, 1, 0, 1, 0, 0, 1]])
>>> x = np.random.randint(0,10,size=(1,10))
>>> x
array([[3, 6, 5, 1, 0, 7, 3, 9, 6, 0]])
>>> np.piecewise(x,[x>7,x<4],[lambda x:x*2,lambda x:x*3,0])
array([[ 9, 0, 0, 3, 0, 0, 9, 18, 0, 0]])
• 计算唯一值以及出现次数
>>> x = np.random.randint(0,10,10)
>>> x
array([4, 7, 3, 6, 7, 4, 1, 9, 4, 8])
>>> np.bincount(x)
array([0, 1, 0, 1, 3, 0, 1, 2, 1, 1])
>>> np.unique(x)
array([1, 3, 4, 6, 7, 8, 9])
• 计算加权平均
>>> x = np.random.randint(0,10,10)
>>> x
array([7, 8, 5, 8, 0, 7, 9, 9, 9, 7])
>>> y = np.array([round(i,1) for i in list(np.random.random(10))])
>>> y
array([ 0.6, 0.8, 0.8, 0. , 0.6, 0.1, 0. , 0.2, 0.8, 0.7])
>>> np.sum(x*y)/np.sum(np.bincount(x))
2.9199999999999999
 

2 scipy应用


• scipy在numpy的基础上增加了大量用于数学计算、科学计算以及工程计算的模块,包括线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。
• scipy主要模块有:
constants:常数
special:特殊函数
optimize:数值优化算法,如最小二乘拟合(leastsq)、函数最小值(fmin系列)、非线性方程组求解(fsolve)等等。
interpolate:插值(interp1d、 interp2d等等)
integrate:数值积分
signal:信号处理
ndimage:图像处理,包括filters滤波器模块、 fourier傅里叶变换模块、 interpolation图像插值模块、 measurements图像测量模块、 morphology形态学图像处理模块等等。
stats:统计

(1) 常数与特殊函数


• scipy的constants模块包含了大量用于科学计算的常数,详情可以查看
http://docs.scipy.org/doc/scipy/reference/constants.html
• 例如
>>> from scipy import constants as C
>>> C.c#真空中的光速
299792458.0
>>> C.h#普朗克常数
6.62606896e-34
>>> C.mile#一英里等于多少米
1609.3439999999998
>>> C.inch#一英寸等于多少米
0.0254
>>> C.degree#一度等于多少弧度
0.017453292519943295
>>> C.minute#一分钟等于多少秒
60.0
• scipy的special模块包含了大量函数库,包括基本数学函数、特殊函数以及numpy中的所有函数。
>>> from scipy import special as S
>>> x = [0, np.pi/2, np.pi, np.pi*1.5, np.pi*2]
>>> S.sinc(x)
array([ 0.00000000e+00, 1.00000000e+00, 1.22464680e-16,
-1.00000000e+00, -2.44929360e-16])
>>> S.gamma(4)#gamma函数
6.0

(2) scipy简单应用

• 中值滤波
>>> import random
>>> import numpy as np
>>> import scipy.signal as signal
>>> x = np.arange(0,100,10)
>>> random.shuffle(x)                   打乱
>>> x
array([40, 0, 60, 20, 50, 70, 80, 90, 30, 10])
>>> signal.medfilt(x,3)
array([ 0., 40., 20., 50., 50., 70., 80., 80., 30., 10.])
 

3 matplotlib简单应用

• matplotlib模块依赖于numpy模块和tkinter模块,可以绘制多种形式的图形,包括线图、直方图、饼状图、散点图、误差线图等等。

• 绘制正弦曲线
>>> import numpy as np
>>> import pylab as pl
>>> t = np.arange(0.0, 2.0*np.pi, 0.01)
>>> s = np.sin(t)
>>> pl.plot(t,s)
>>> pl.xlabel('x')
>>> pl.ylabel('y')
>>> pl.title('sin')
>>> pl.plot(t,s)
>>> pl.show()

• 绘制散点图
>>> a = np.arange(0, 2.0*np.pi, 0.1)
>>> b = np.cos(a)
>>> pl.scatter(a,b)                                                     做 聚类看图
>>> pl.show()

• 绘制散点图
>>> import matplotlib.pylab as pl
>>> import numpy as np
>>> x = np.random.random(100)
>>> y = np.random.random(100)
>>> pl.scatter(x,y,s=x*500,c=u'r',marker=u'*')      #s指大小, c指颜色, marker指符号形状
>>> pl.show()

• 修改散点符号
>>> a = np.arange(0, 2.0*np.pi, 0.1)
>>> b = np.cos(a)
>>> pl.scatter(a,b,marker='+')
>>> pl.show()
 

• 使用pyplot绘制,多个图形在一起显示
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 500)
y = np.sin(x)
z = np.cos(x*x)
plt.figure(figsize=(8,4))
#标签前后加$将使用内嵌的LaTex引擎将其显示为公式
plt.plot(x,y,label='%sin(x)$',color='red',linewidth=2)#红色, 2个像素宽
plt.plot(x,z,'b--',label='$cos(x^2)$')#蓝色,虚线
plt.xlabel('Time(s)')
plt.ylabel('Volt')
plt.title('Sin and Cos figure using pyplot')
plt.ylim(-1.2,1.2)
plt.legend()#显示图示
plt.show()#显示绘图窗口

• 使用pyplot绘制,多个图形单独显示
import numpy as np
import matplotlib.pyplot as plt
x= np.linspace(0, 2*np.pi, 500)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x*x)
#create figure
plt.figure(1)
#create three axes
#first line,first column
ax1 = plt.subplot(2,2,1)
#first line,second column
ax2 = plt.subplot(2,2,2)

#the whole second line
ax3 = plt.subplot(2,1,2)
#choose ax1
plt.sca(ax1)
#draw the curve in ax1
plt.plot(x,y1,color='red')
plt.ylim(-1.2,1.2)
#choose ax2
plt.sca(ax2)
plt.plot(x,y2,'b--')
plt.ylim(-1.2,1.2)
#choose ax3
plt.sca(ax3)
plt.plot(x,y3,'g--')
plt.ylim(-1.2,1.2)
plt.legend()
plt.show()

• 绘制三维图形,在绘图窗口中可用鼠标旋转
 

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d                     画3D的包
x,y = np.mgrid[-2:2:20j, -2:2:20j]
z = 50 * np.sin(x+y)
ax = plt.subplot(111, projection='3d')
ax.plot_surface(x,y,z,rstride=2, cstride=1, cmap=plt.cm.Blues_r)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
 

sy13-sy19都是作图的例子。

4 数据分析模块pandas
 

1)生成一维数组
>>> import pandas as pd
>>> import numpy as np
>>> x = pd.Series([1, 3, 5, np.nan])                     和numpy很像
(2)生成二维数组

DataFrame:就是表的意思
>>> dates = pd.date_range(start='20130101', end='20131231', freq='D') #间隔为天
>>> dates = pd.date_range(start='20130101', end='20131231', freq='M') #间隔为月
>>> df = pd.DataFrame(np.random.randn(12,4), index=dates, columns=list('ABCD'))
>>> df = pd.DataFrame([[np.random.randint(1,100) for j in range(4)] for i in range(12)], index=dates,
columns=list('ABCD')) #4列随机数
>>> df = pd.DataFrame({'A':[np.random.randint(1,100) for i in range(4)],
'B':pd.date_range(start='20130101', periods=4, freq='D'),
'C':pd.Series([1, 2, 3, 4],index=list(range(4)),dtype='float32'),
'D':np.array([3] * 4,dtype='int32'),
'E':pd.Categorical(["test","train","test","train"]),
'F':'foo'})
>>> df = pd.DataFrame({'A':[np.random.randint(1,100) for i in range(4)],
'B':pd.date_range(start='20130101', periods=4, freq='D'),
'C':pd.Series([1, 2, 3, 4],index=['zhang', 'li', 'zhou', 'wang'],dtype='float32'),
'D':np.array([3] * 4,dtype='int32'),
'E':pd.Categorical(["test","train","test","train"]),
'F':'foo'})
( 3)二维数据查看
>>> df.head() #默认显示前5行
>>> df.head(3) #查看前3行
>>> df.tail(2) #查看最后2行

( 4)查看二维数据的索引、列名和数据
>>> df.index
>>> df.columns         列
>>> df.values

( 5)查看数据的统计信息
>>> df.describe() #平均值、标准差、最小值、最大值等信息
( 6)二维数据转置
>>> df.T
( 7)排序
>>> df.sort_index(axis=0, ascending=False) #对轴进行排序
>>> df.sort_index(axis=1, ascending=False)
>>> df.sort_values(by='A') #对数据进行排序
>>> df.sort_values(by='A', ascending=False) #降序排列
( 8)数据选择
>>> df['A'] #选择列
>>> df[0:2] #使用切片选择多行
>>> df.loc[:, ['A', 'C']] #选择多列
>>> df.loc[['zhang', 'zhou'], ['A', 'D', 'E']] #同时指定多行与多列进行选择
>>> df.loc['zhang', ['A', 'D', 'E']]
>>> df.at['zhang', 'A'] #查询指定行、列位置的数据值
>>> df.at['zhang', 'D']
>>> df.iloc[3] #查询第3行数据
>>> df.iloc[0:3, 0:4] #查询前3行、前4列数据
>>> df.iloc[[0, 2, 3], [0, 4]] #查询指定的多行、多列数据
>>> df.iloc[0,1] #查询指定行、列位置的数据值
>>> df.iloc[2,2]
>>> df[df.A>50] #按给定条件进行查询

9)数据修改与设置
>>> df.iat[0, 2] = 3 #修改指定行、列位置的数据值
>>> df.loc[:, 'D'] = [np.random.randint(50, 60) for i in range(4)] #修改某列的值
>>> df['C'] = -df['C'] #对指定列数据取反
( 10)缺失值处理
>>> df1 = df.reindex(index=['zhang', 'li', 'zhou', 'wang'],
columns=list(df.columns) + ['G'])
>>> df1.iat[0, 6] = 3 #修改指定位置元素值,该列其他元素为缺失值NaN
>>> pd.isnull(df1) #测试缺失值,返回值为True/False阵列
>>> df1.dropna() #返回不包含缺失值的行

>>> df1['G'].fillna(5, inplace=True) #使用指定值填充缺失值

(11)数据操作
( 12)结合matplotlib绘图


5 统计分析模块statistics
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值