day01------数据分析简介-numpy入门与基础-数据可视化------
python人工智能学习的两个阶段
第一阶段:数据分析简介
matlab+C/C++
Numpy/Scipy/Matplotlib/Pandas/sklearn/tensorflow/...
Numpy:基础数值算法
Scipy:科学计算,如桥梁测试,卫星轨道,电子行业等
Matplotlib:数据可视化工具,可视化处理Numpy/Scipy的数据
Pandas:序列高级处理函数,封装了Numpy/Scipy/Matplotlib,金融行业应用较多
第二阶段:机器学习
数据预处理
选择模型
训练模型
验证模型/预测模型
一、numpy入门
1.numpy是什么?
1)numpy是Numerical Python的缩写,意为“数值的Python”,补充了python所欠缺的数值计算能力。
2)numpy是一整套开源科学计算库。(GPL,要求都开源 LGPL,用开源开发,之后可以收费)
3)numpy弥补了作为通用编程语言的Python在数值计算方面,能力弱、速度慢的不足。
4)numpy拥有丰富的数学函数、强大的多维数组和优异的运算能力。
5)numpy与scipy、scikits、matplotlib等其它科学计算库可以很好地协调工作。
6)numpy可取代matlab和mathematica的功能,并允许用户进行快速交互式原型开发。
7)是其他数据分析及机器学习库的底层库
8)是完全标准的C语言实现,运行效率充分优化,不逊于其他编译语言,如Java等
2.Numpy的历史背景
1)1995年,numeric,早期的python语言数值计算库,如今已废弃;
2)2001年,scipy项目启动,所需要的新特性高维数组被实现于numarray(多维数值运算)中;
3)2005年,重构numeric,意图将numarray中的新特性整合到numeric中;
4)2006年,Numpy独立于scipy正式发布,同时拥有numeric和numarray的全部特性。(Ver. 1.13)
3.Numpy的核心:多维数值
1)代码简洁:同样的计算任务,使用Numpy比纯python代码少得多;
2)存储效率和I/O性能远胜于python;
3)Numpy底层实现:厚内核(C)+薄接口(python),使用C语言甚至汇编语言,保证性能,运行速度达到极限;
演示代码:vector.py
import datetime as dt
import numpy as np
n = 100000
start = dt.datetime.now()
A , B = [],[]
for i in range(n):
A.append(i ** 2)
B.append(i ** 3)
C = []
for a,b in zip(A,B):
C.append(a + b )
end = dt.datetime.now()
print((end - start).microseconds)
#302827 , 338806
start = dt.datetime.now()
A , B = np.arange(n) ** 2 , np.arange(n) ** 3
C = A + B
end = dt.datetime.now()
print((end - start).microseconds)
#10993, 8993
4)Numpy是完全开源的,成本低且没有法律风险。
4.Numpy的局限性
1)内置数据结构的通用性不及python,在科学计算以外的领域,Numpy的优势并不明显;
2)Numpy的模块是用C语言编写的,不支持jython。
5.Numpy的安装
1)在线安装
python -m pip install numpy -- 安装纯numpy
numpy+mkl (Intel (R) Math Kernel Library)
2)离线安装
numpy-1.13.3+mkl-cp36-cp36m-win_amd64.whl
scipy-0.19.1-cp36-cp36m-win_amd64.whl
matplotlib-2.0.2-cp36-cp36m-win_amd64.whl
6.numpy核心——多维数组
代码:vector_sum.py
二、numpy基础
1.数组对象
1)numpy的数组是numpy.ndarray类型的对象,其中包括实际数据(即数组中的元素),
以及描述这些数据的元数据(描述数组中元素),
大部分针对数组的操作实际上仅仅是针对其元数据的操作,以此提升性能。
将实际数据和元数据分开存放,一方面提高了内存空间的使用效率
另一方面减少对实际数据的访问频率,提高性能
2)numpy数组的元素必须是同质的,即类型完全一致。
3)numpy数组的下标从0开始,最后一个元素的下标是数组长度减1。
4)numpy数组对象的dtype属性表示元素的数据类型。
5)numpy数组对象的shape属性表示数组的维度,通过一个tuple表现,
其中的每一个元素即相应维度的大小。
6)numpy数组对象的size属性表示数组的大小.
7)创建数据的方法:
numpy.arange(起始(默认为0), 终止, 步长(默认为1)):
获得一个数组形式等差序列
numpy.array([元素1, 元素2, ...]):
获得一个包含给定元素的数组对象-->任意维度,任意类型
2.下标访问,索引号访问
一维数组[索引号]
二维数组[行号,列号]
三维数组[页号,行号,列号]
多维数组[...,页号,行号,列号]
数组对象.shape()-->得到(...,页数,行数,列数)
下标值范围 =(0, 维度数值-1)
代码:shape.py
3.数据类型
1)python的内置类型
布尔型bool
整型int
浮点型float
复数型complex
字符型str
元组tuple
列表list
字典dict
聚合set
2)numpy的内置类型
布尔型bool_,1个字节
整型int:
有符号整型:int8/int16/int32/int64
无符号整型:uint8/uint16/uint32/uint64
浮点型float:float16/float32/float64
复数型complex:
complex64 / complex128
(实部,虚部)
如一个人的身高体重,实部可为身高,虚部为体重
字符型str_:每个字符都是用32位Unicode编码表示
3)自定义类型
示例一:
#以下是一个自定义类型,()中为一个元素整体,
# dtype指明元素内的构成情况:u3,表示3个unicode字符,3i4,表示3个4字节整型
#访问自定义类型元素内的值,用带引号的f+ 元素内部下标方式进行,如:['f0' ]
a = np.array([('abc',[1,2,3])],dtype='U3,3i4')
print(a[0]['f0'],a[0]['f1']) #得到abc, [1 2 3]
示例二:
#可在dtype中指定名称,数据类型,长度,如dtype=[('fa',np.str_,3),('fb',np.int32,3)])
#其中('abc名称',np.str_,3),表示abc对应的字段名为'fa',数据类型为str,有3个字符数
#('fb',np.int32,3),表示[1,2,3]对应的字段名为'fb',数据类型为int32,有三个元素
#与上例比,多了名称标识。其中i4就是int32
#访问时,直接通过字段名访问
b = np.array([('abc',[1,2,3])],
dtype=[('fa',np.str_,3),('fb',np.int32,3)])
print(b[0]['fa'],b[0]['fb']) #得到abc, [1 2 3]
示例三:
#dtype也可用字典方式指定
#dtype={'names':['fa','fb'],'formats':['U3','3i4']} 注意:U为大写
#'names':['fa','fb'],表示对应的字段名,注意:names不可修改
#'formats':['u3','3i4'],表示对应的数据类型和元素数量,注意:formats不可修改
c = np.array([('abc',[1,2,3])],
dtype={'names':['fa','fb'],'formats':['U3','3i4']})
print(c[0]['fa'],c[0]['fb'],c.itemsize) #得到abc, [1 2 3],24
示例四:
#dtype可通过内存长度偏移量表示
#'fa':('U3',0),直接命名'fa',从d的第0个字节开始设置为U3类型
#'fb':('3i4',16),直接命名'fa',从d的第16个字节开始设置为3i4类型
#如果fb的偏移量大于fa的字节数,则中间会空余内存
#空余内存可用于空间对齐,优化访问效率,但会浪费空间
d = np.array([('abc',[1,2,3])],
dtype={'fa':('U3',0),'fb':('3i4',16)})
print(d[0]['fa'],d[0]['fb'],d.itemsize) #得到abc, [1 2 3],28
示例五:
#dtype可对一个内存块进行描述
#dtype=('u2',{'lowId':('u1',0),'highId':('u1',1)}))
#'u2',表示将'0x1234'看成为一个2字节整体。因为'0x1234'本身就表示一个2字节的地址。
#{'lowId':('u1',0),'highId':('u1',1)},表示按照另一种类型表示。
#'lowId'为命名,'u1'表示uint8,0表示字节偏移量
e = np.array([0x1234],
dtype=('u2',{'lowId':('u1',0),'highId':('u1',1)}))
print('{:x}'.format(e[0]))#{:x},16进制输出为1234
print(e[0],e['lowId'][0],e['highId'][0])#输出4660 52 18
print('{:x},{:x},{:x}'.format(e[0],e['lowId'][0],e['highId'][0]))#输出为1234,34,12
注意:需要统一字节序,如不统一,会导致不同机器出现不同结构
>,表示大端字节序
<,表示小端字节序
=,与默认值一样,同硬件有关,与操作系统无关
一般intel,为小端字节序
arm,ibm等,为大端字节序
如,本例中
dtype=('<u2',{'lowId':('<u1',0),'highId':('<u1',1)})
则输出:1234,34,12
dtype=('>u2',{'lowId':('>u1',0),'highId':('>u1',1)})
则输出:1234,12,34
4)numpy的类型字符码
布尔:?
有符号字节:b
无符号字节:B
整型:
int8/16/32/64: i1/i2/i4/i8
无符号整型:
uint8/16/32/64: u1/u2/u4/u8
浮点:
float16/32/64: f2/f4/f8
复数:
complex64/128: c8/c16
时间增量:m
日期时间datetime:M8
日期类型:M8[D],D以日为单位
Python对象:O
字节序列形式的字符串:S或a
Unicode字符串str_:Ux,x为字符数
空类型:V
字节序前缀:仅用于多字节整数和字符串
大端(高位低址):>,小端(高位高址):<
自动(自动匹配硬件字节序):=
一个完整的字符类型码表示:
<字节序前缀><维度><类型><字节数或字符数>
如:>3i4,表示大端字节序,3个元素的一维数组,
每个元素都是整型,每个元素都占4个字节
<(2,3)u8,表示小端字节序,6个元素的二维数组,2行,3列
每个元素都是无符号整型,每个元素占8个字节
>U7,表示7个字符的大端Unicode字符串,每个字符4个字节
4.切片
数据对象[起始位置:终止位置:位置步长,...]
缺省起始位置:如果步长为正,缺省为0,首;如果步长为负,缺省为-1,尾
缺省终止位置:如果步长为正,尾后;如果步长为负,首前
缺省位置步长:1
代码:slice.py
5.改变维度
1)视图变维,返回新的数组对象,与原数组数据共享
a = numpy.arange(1, 7) # [1 2 3 4 5 6]
b = a.reshape(2, 3) # [[1 2 3] 把a变为2行,3列的二维数组
# [4 5 6]]
c = b.reshare (6) # [1 2 3 4 5 6] 把b变为一维
d = b.ravel () # [1 2 3 4 5 6] ,把任意维变为一维
2)复制变维,返回新的数组对象,与原数组的数据独立
e = b.flatten () # [1 2 3 4 5 6]
3)就地变维,直接改变原数组维度,不返回新数组
a.shape = (2, 3) # [[1 2 3]
# [4 5 6]]
a.resize ((3, 2))
4)视图转置
代码:reshape.py
6.组合
1)垂直组合
v = numpy.vstack((u, d))
[u]上部的数组
[d]下部的数组
v = numpy.concatenate((上, 下),axis = 0)
axis = x axis表示轴向,即按什么方向组合,与维度索引一致
二维数组:0-行,垂直,1-列,水平
三维数组:0-页,深度,1-行,垂直,2-列,水平
2)水平组合
numpy.hstack ((左,右))
h = numpy.hstack ((1, r))
numpy.concatenate((左,右),axis = 1)
[l][r]
3)深度组合
numpy.dstack ((前,后))
4)行组合
r = numpy.row_stack ((u, d))
u: [1 2 3]
d: [4 5 6]
r :[[1 2 3]
[4 5 6]]
5)列组合
c = numpy.column_stack ((l, r))
l: [1 2 3]
r: [4 5 6]
c: [[1 4]
[2 5]
[3 6]]
7.拆分/分割
1)垂直分割
u, m, d = numpy.vsplit (v, 3) #v要拆分的数组,3表示要拆分的份数
等价于:
numpy.split(v,3,axis = 0)
2)水平分割
l, m, r = numpy.hsplit(h, 3)
numpy.split(数组,份数,axis = 1)
3)深度分隔
x, y = numpy.dsplit (数组, 份数)
代码:stack.py
8.numpy.ndarray类的主要属性汇总
import numpy as np
arange:arr = np.arange(1,4) #创建一个一维数组
array:arr = np.array([np.arange(1,4),
np.arange(4,7),
np.arange(7,10)]) #创建一个二维数组(3行,3列)
arr = np.array([[1,5,3],[4,5,6]]) #创建一个二维数组(2行,3列)
shape:arr.shape #获得数组的维度情况(行数,列数)
dtype:arr.dtype #显示数组的数据类型
size:arr.size #数组的大小,即元素的个数
reshape:arr.reshape() #将数组转换为指定维度格式
arr = np.arange(1,25).reshape((2,3,4)) #将一个一维数组转换为3维数组
arr.itemsize:arr.itemsize,每个元素的字节数
arr.ndim - 维数
arr.nbytes - 数组的总字节数,= size * itemsize
arr.T - 转置视图
arr.real - 复数数组的实部数组
arr.imag - 复数数组的虚部数组
arr.flat - 扁平迭代器
arr.tolist() - 转化为python列表
代码:attr.py
三、数据可视化Matplotlib
Matlab 商业工具,可以对算法测试
python + Numpy + Matplotlib 可完全替换Matlab
1、基本绘图
mp.plot(水平坐标,垂直坐标)
示例一:
import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-np.pi,np.pi,1000)
cos_y = np.cos(x) / 2
sin_y = np.sin(x)
mp.plot(x,cos_y)
mp.plot(x,sin_y)
mp.show()
2、线型、线宽和颜色
mp.plot(水平坐标,垂直坐标,linestyle=线型,linewidth=线宽,color=颜色,...)
linestyle='--' 虚线 / ':' 点线
linewidth= 2 默认为2,线的粗细
示例:
import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-np.pi,np.pi,1000)
cos_y = np.cos(x) / 2
sin_y = np.sin(x)
mp.plot(x,cos_y,linestyle='--',linewidth= 1 ,color = 'green') # -- 为虚线
mp.plot(x,sin_y,linestyle=':', linewidth = 4,color='blue') # : 为点线
mp.show()