这里记录着小沈在学习神经网络与深度学习之TensorFlow实践课程中,遇到的两个比较重要又有意思的库:科学计算库NumPy和数据可视化库Matplotlib。
NumPy科学计算库
- 提供了多维数组、矩阵的常规操作和一些高效的科学计算函数
- 底层运算用过C语言实现,处理速度快,效率高,适用于大规模多维数组
- 可以直接完成数组和矩阵运算,无需循环
1.多维数组的基本概念
形状(shape):是一个元组,描述数组的维度(元组中有几个数就代表几维),以及各个维度的长度
长度(length):某个维度中的元素个数
2.NumPy数组的创建及其属性
2.1 创建数组:array([列表]/(元组))
一维数组的创建与索引
1
2
3
4
5
6import numpy as np
#一维数组的创建
a=np.array([1,2,3,4])
print(type(a)," ",a)
#一维数组的索引,同序列
print(a[0:2])结果如下:
二维数组的创建与索引
1
2
3
4
5
6
7
8
9
10import numpy as np
#二维数组的创建
b=np.array([[1,2,3,0],[4,5,6,0],[7,8,9,0]])
print("The array is:\n",b)
#二维数组的索引
print("The index is:")
print(b[0])
print(b[1])
print(b[2])
print(b[2][1])#还可以用print(b[2,1])这样的索引方式结果如下:
三维数组的创建与索引
1
2
3
4
5
6
7
8
9
10import numpy as np
#三维数组的创建
c=np.array([[[1,2,3,4],[4,5,6,7],[7,8,9,0]],[[11,12,13,14],[12,13,15,16],[16,17,18,19]]])
print("The array is:\n",c,'\n')
#三维数组的索引
print("The index is:")
print(c[0])
print(c[0][0])
print(c[0][0][0])
print(c[0,0,0])结果如下:
2.2 数组的属性
属性 | 描述 |
---|---|
ndim | 数组的维数 |
shape | 数组的形状 |
size | 数组元素的总个数 |
dtype | 数组中元素的数据类型 |
itemsize | 数组中每个元素的字节 |
1 | import numpy as np |
结果如下:
2.3创建特殊的数组
函数 | 功能描述 |
---|---|
np.arange(起始数字,结束数字,步长,dtype=数据类型) | 创建数字序列数组,默认数据类型为int32 |
np.ones(shape,dtye=数据类型) | 创建全1数组,默认数据类型为float64 |
np.zeros(shape,dtye=数据类型) | 创建全0数组,默认数据类型为float64 |
np.eye(shape) | 创建单位矩阵,默认数据类型为float64 |
np.linspace(start,stop,num=50) | 创建等差数列,默认数据类型为float64 |
np.logspace(start,stop,num=50,base=10) | 创建等比数列,默认数据类型为float64,修改基数时一定要加base= |
1 | import numpy as np |
结果如下:
3.数组运算
改变数组的函数
函数 功能描述 np.reshape(shape) 不改变当前数组,按照shape创建新的数组 np.resize(shape) 改变当前数组,按照shape创建数组 1
2
3
4
5
6
7
8
9#创建数组,并按照shape创建新的数组
b=np.arange(12)
print(b)
print(b.reshape(3,4))
print(b) #执行reshape语句后原数组并未被改变
print(40*"-")
#创建数组,并改变数组形状
b.resize(3,4)
print(b) #由结果,很明显数组被改变了结果如下:
数组与数组之间常见运算
加法运算:一维数组可以和多维数组相加,相加时会将一维数组扩展至多维
1
2
3
4import numpy as np
a=np.array([1,2,3,4])
b=np.array([[0,8,67,5],[3,456,7,3],[4,68,1,9]])
print(a+b)结果如下:
幂运算:
array**2
#对数组中的每个元素求n次方1
2
3
4import numpy as np
b=np.arange(12).reshape(3,4)
print("The array b is:\n",b)
print("The b**2 is:\n",b**2)结果如下:
矩阵运算:转置和求逆
- 矩阵转置:
np.transpose()
- 矩阵求逆:
np.linalg.inv()
- 矩阵相乘:
np.matmul()
- 矩阵转置:
数组中元素的计算
常见的数组间元素的计算函数
函数 功能描述 np.sum() 计算所有元素的和 np.prod() 计算所有元素的乘积 np.diff() 计算数组相邻元素之间的差值 np.sqrt() 计算各元素的平方根 np.exp() 计算各元素的指数值 np.abs() 取各元素的绝对值 1
2
3
4import numpy as np
print(c)
c=np.array([[3,7,5,4],[48,47,3,28]])
print("The diff:\n",np.diff(c))结果如下:
np.linalg.norm(x, ord=None, axis=None, keepdims=False)
ord
参数 说明 计算方法 默认 二范数: ord=2 二范数: 同上 ord=1 一范数: ord=np.inf 无穷范数: axis表示在某个轴上求值
keeptime=True表示结果保留x的维度特性,若keeptime=False将会减少一个维度
1
2
3
4
5
6
7
8x = np.array([
[0, 3, 4],
[1, 6, 4]])
x1 = np.linalg.norm(x,axis=1,keepdims=True)
print(x1)
print(25*'-')
x2 = np.linalg.norm(x,axis=1,keepdims=False)
print(x2)结果如下:
关于轴(axes)与秩(rank)控制的运算
轴(axes):数组中的每一个维度被称为一个轴
秩(rank):轴的个数:对于二维数组rank=2;三维数组rank=3
通过控制axes实现数组内的加法运算
1
2
3
4
5
6
7
8import numpy as np
c=np.arange(24).reshape(2,3,4)
print("The array is:\n",c,'\n')
print(np.sum(c,axis=0))
print(40*"-")
print(np.sum(c,axis=1))
print(40*"-")
print(np.sum(c,axis=2))结果如下:
数组堆叠运算:
np.stack((数组1,数组2,……),axis)
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
26import numpy as np
#一维数组的堆叠
x=np.array([1,2,3])
y=np.array([4,5,6])
print("一维数组的堆叠:")
print("Axis=0:")
print(np.stack((x,y),axis=0))
print("Axis=1:")
print(np.stack((x,y),axis=1))
print(30*"-")
#二维数组的堆叠
print("二维数组的堆叠:")
m=np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])
n=np.array([[10,20,30,10],[40,50,60,10],[70,80,90,10]])
a0=np.stack((m,n),axis=0)
a1=np.stack((m,n),axis=1)
a2=np.stack((m,n),axis=2)
print("The shape is:",a0.shape)
print("The array is:\n",a0)
print(30*"*")
print("The shape is:",a1.shape)
print("The array is:\n",a1)
print(30*"*")
print("The shape is:",a2.shape)
print("The array is:\n",a2)
print(30*"*")结果如下:
4.矩阵
矩阵生成
np.matrix(字符串/列表/元组/数组)
np.mat(字符串/列表/元组/数组)
矩阵对象的属性
属性 说明 .ndim 矩阵的维数 .shape 矩阵的形状 .size 矩阵的元素个数 .dtype 元素的数据类型 矩阵运算
矩阵相乘
1
2
3
4import numpy as np
a1=np.mat([[0,1],[2,3]])
a2=np.mat([[1,1],[2,0]])
print(a1*a2)转置、求逆
矩阵转置:matrix.T
矩阵求逆:matrix.I
5.随机数模块
函数 | 功能描述 | 返回值 |
---|---|---|
np.random.rand(d0,d1,……,dn) | 元素在[0:1)区间均匀分布的数组,(d0,d1,dn)表示形状(shape) | 浮点数 |
np.random.uniform(low,hige,size) | 元素在[low,hige)区间均匀分布的数组 | 浮点数 |
np.random.randint(low,hige,size) | 元素在[low,hige)区间均匀分布的数组 | 整数 |
np.random.randn(d0,d1,……,dn) | 产生标准正态分布的数组 | 浮点数 |
np.random.normal(loc,scale,size) | 产生正态分布的数组,loc表示均值,scale表示方差 | 浮点数 |
np.random.seed() | 随机种子,设置随机种子相同时,产生的随机数相同,默认为系统时间 | |
np.random.shuffle(序列) | 打乱数组第一个维度的顺序 |
Matplotlib数据可视化
- 绘制图表的第三方库,可以快速方便地生成高质量的图表
1.Matplotlib绘图基础
本文均讨论Matplotlib中二维图标的绘制,故引入:import matplotlib.pyplot as plt
figure对象:
figure(num,figsize,dpi,facecolor,edgecolor,frameon)
特征 描述 num 图形编号或名称,取值为数字/字符串 figsize 绘制对象的宽和高,单位为英寸 dpi 绘制对象的分辨率,缺省值为80 facecolor 背景颜色 edgecolor 边框颜色 linewidth 边框宽度 frameon 表示是否显示边框 1
2
3
4
5
6
7
8
9
10
11
12import matplotlib.pyplot as plt
fig = plt.figure(
num=10,
figsize=(3,2), # 指定画布大小,(宽度,高度),单位为英寸
dpi=80, # 指定绘图对象的分辨率,即每英寸多少个像素,
facecolor='yellow', # 背景颜色
edgecolor='blue', #边框颜色
linewidth=4.0, # 边框宽度
frameon=True,
)
plt.plot()
plt.show()结果如下:
划分子图:
subplot(行数,列数,子图序号)
设置中文字体:
plt.rcParams["font.sans-serif"]="SimHei"
添加标题:
添加全局标题:
suptitle(标题文字)
添加子标题:
title(标题文字)
自动调整子图间隔:
tight_layout()
1 | import matplotlib.pyplot as plt |
结果如下:
2.散点图
绘制散点图:
scatter(x,y,scale,color,marker,label)
参数 说明 默认值 x 数据点的x坐标 不可省略 y 数据点的y坐标 不可省略 scale 数据点的大小 36 color 数据点的颜色 浅蓝 marker 数据点的样式 ‘o’(圆点) label 图列文字 marker相关参数:
使用
plt.legend(loc,fontsize)
显示图例
在指定位置添加文字:
text(x,y,s,fontsize,color)
参数 说明 默认值 x 文字的x坐标 不可省略 y 文字的y坐标 不可省略 s 显示的文字 不可省略 fontsize 文字的大小 12 color 文字的颜色 黑色 坐标轴设置
函数 说明 xlabel(x,y,s,fontszie,color) 设置x轴标签 ylabel(x,y,s,fontszie,color) 设置y轴标签 xlim(xmin,xmax) 设置x轴坐标的范围 ylim(ymin,ymax) 设置y轴坐标的范围 tick_params(labelsize) 设置刻度文字的字号 当设置字体为中文,坐标系中有负数,则做此设置:
plt.rcParams["axes.unicode_minus"]=False
1 | import matplotlib.pyplot as plt |
结果如下:
3.折线图
plt.plot(x,y,color,marker,label,linewidth,markersize)
参数 | 说明 | 默认值 |
---|---|---|
x | 数据点的x坐标 | 0,1,2,…… |
y | 数据点的y坐标 | 不可缺省 |
color | 数据点的颜色 | |
marker | 数据点的样式 | ‘o’(圆点) |
label | 图例文字 | |
linewidth | 折线的宽度 | |
markersize | 数据点的大小 |
1 | import matplotlib.pyplot as plt |
结果如下:
4.柱状图
bar(left,height,width,facecolor,edgecolor,label)
1 | import matplotlib.pyplot as plt |
结果如下:
实例分析:波士顿房价数据集可视化
1 | import matplotlib.pyplot as plt |
部分结果如下:
附:相关网站
- Matplotlib官网:https://matplotlib.org
- Gallery页面:https://matplotlib.org/gallery.html