0%

TensorFlow实践之NumPy与Matplotlib库

这里记录着小沈在学习神经网络与深度学习之TensorFlow实践课程中,遇到的两个比较重要又有意思的库:科学计算库NumPy和数据可视化库Matplotlib。

NumPy科学计算库

  • 提供了多维数组、矩阵的常规操作和一些高效的科学计算函数
  • 底层运算用过C语言实现,处理速度快,效率高,适用于大规模多维数组
  • 可以直接完成数组和矩阵运算,无需循环

1.多维数组的基本概念

  • 形状(shape):是一个元组,描述数组的维度(元组中有几个数就代表几维),以及各个维度的长度

  • 长度(length):某个维度中的元素个数

    image-20221027163211507

2.NumPy数组的创建及其属性

2.1 创建数组:array([列表]/(元组))

  • 一维数组的创建与索引

    1
    2
    3
    4
    5
    6
    import numpy as np 
    #一维数组的创建
    a=np.array([1,2,3,4])
    print(type(a)," ",a)
    #一维数组的索引,同序列
    print(a[0:2])

    结果如下:

    image-20221027164257343
  • 二维数组的创建与索引

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import 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])这样的索引方式

    结果如下:

    image-20221027165415344
  • 三维数组的创建与索引

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import 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])

    结果如下:

    image-20221027170734415

2.2 数组的属性

属性 描述
ndim 数组的维数
shape 数组的形状
size 数组元素的总个数
dtype 数组中元素的数据类型
itemsize 数组中每个元素的字节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import 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("三维数组的属性:")
print("数组维度:",c.ndim)
print("数组形状:",c.shape)
print("数组元素总个数:",c.size)
print(20*"-")
#二维数组的属性
print("二维数组的属性:")
print("数组维度:",c[0].ndim)
print("数组形状:",c[0].shape)
print("数组元素总个数:",c[0].size)

结果如下:

image-20221027172312521

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
#创建数字序列
print("此数字序列是:\n",np.arange(1,10,2))
print(np.arange(1,10,2).dtype)
print(50*'-')
#创建全1数组
print("此全1数组是:\n",np.ones((2,3)))
print(np.ones((2,3)).dtype)
print(50*'-')
#创建单位矩阵
print("此单位矩阵是:\n",np.eye(3,3))
print(np.eye(3,3).dtype)
print(50*'-')
#创建等差数列
print("此等差数列是:",np.linspace(1,10,10))
print(np.linspace(1,10,10).dtype)
print(50*'-')
#创建等比数列:开始的数为base^start,结束的数为base^stop,num表示总共生成几个数
print("此等比数列是:",np.logspace(1,5,5,base=2))
print(np.logspace(1,5,5,base=2).dtype)

结果如下:

image-20221027184800827

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) #由结果,很明显数组被改变了

    结果如下:

    image-20221027201249163
  • 数组与数组之间常见运算

    • 加法运算:一维数组可以和多维数组相加,相加时会将一维数组扩展至多维

      1
      2
      3
      4
      import 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)

      结果如下:

      image-20221027201731666
    • 幂运算array**2#对数组中的每个元素求n次方

      1
      2
      3
      4
      import 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)

      结果如下:

      image-20221027202136524
    • 矩阵运算:转置和求逆

      • 矩阵转置:np.transpose()
      • 矩阵求逆:np.linalg.inv()
      • 矩阵相乘:np.matmul()
  • 数组中元素的计算

    • 常见的数组间元素的计算函数

      函数 功能描述
      np.sum() 计算所有元素的和
      np.prod() 计算所有元素的乘积
      np.diff() 计算数组相邻元素之间的差值
      np.sqrt() 计算各元素的平方根
      np.exp() 计算各元素的指数值
      np.abs() 取各元素的绝对值
      1
      2
      3
      4
      import numpy as np
      print(c)
      c=np.array([[3,7,5,4],[48,47,3,28]])
      print("The diff:\n",np.diff(c))

      结果如下:

      image-20221027203826317
    • np.linalg.norm(x, ord=None, axis=None, keepdims=False)

      • ord

        参数 说明 计算方法
        默认 二范数:l_{2} \sqrt{x_{1}^{2} + x_{2}^{2} + ... + x_{n}^{2}}
        ord=2 二范数:l_{2} 同上
        ord=1 一范数:l_{1} \left | x_{1} \right | + \left | x_{2} \right | + ... + \left | x_{n} \right |
        ord=np.inf 无穷范数:l_{\infty} MAX \left | x_{i} \right |
      • axis表示在某个轴上求值

      • keeptime=True表示结果保留x的维度特性,若keeptime=False将会减少一个维度

      1
      2
      3
      4
      5
      6
      7
      8
      x = 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)

      结果如下:

      image-20221112001803738
    • 关于轴(axes)与秩(rank)控制的运算

      • 轴(axes):数组中的每一个维度被称为一个轴

      • 秩(rank):轴的个数:对于二维数组rank=2;三维数组rank=3

        image-20221027204146469
      • 通过控制axes实现数组内的加法运算

        1
        2
        3
        4
        5
        6
        7
        8
        import 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))

        结果如下:

        image-20221027210417266
      • 数组堆叠运算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
        26
        import 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*"*")

        结果如下:

        image-20221027212847784

4.矩阵

  • 矩阵生成

    • np.matrix(字符串/列表/元组/数组)
    • np.mat(字符串/列表/元组/数组)
  • 矩阵对象的属性

    属性 说明
    .ndim 矩阵的维数
    .shape 矩阵的形状
    .size 矩阵的元素个数
    .dtype 元素的数据类型
  • 矩阵运算

    • 矩阵相乘

      1
      2
      3
      4
      import 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
    12
    import 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()

    结果如下:

    image-20221027232725582
  • 划分子图subplot(行数,列数,子图序号)

    image-20221027233213784
  • 设置中文字体plt.rcParams["font.sans-serif"]="SimHei"

    image-20221027233501687
  • 添加标题

    • 添加全局标题:suptitle(标题文字)

      image-20221027233727329
    • 添加子标题:title(标题文字)

      image-20221027233904919
  • 自动调整子图间隔tight_layout()

    image-20221027234054706
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import matplotlib.pyplot as plt
#设置中文字体
plt.rcParams["font.sans-serif"]="SimHei"
#画布设置
fig=plt.figure(facecolor="lightgrey")
#划分子图并设置其标题
plt.subplot(2,2,1)
plt.title("子标题1")
plt.subplot(2,2,2)
plt.title("子标题2",loc="left",color="b")
plt.subplot(2,2,3)
myfontdict={"fontsize":12,"color":"g","rotation":30}#参数字典的使用
plt.title("子标题3",fontdict=myfontdict)
plt.subplot(2,2,4)
plt.title("子标题4",color="white",backgroundcolor="black")
#设置全局标题
plt.suptitle("全局标题",fontsize=20,color="red",backgroundcolor="yellow")
#调整子图间隔
plt.tight_layout(rect=[0,0,1,0.98])
plt.show()

结果如下:

image-20221028000516819

2.散点图

  • 绘制散点图scatter(x,y,scale,color,marker,label)

    参数 说明 默认值
    x 数据点的x坐标 不可省略
    y 数据点的y坐标 不可省略
    scale 数据点的大小 36
    color 数据点的颜色 浅蓝
    marker 数据点的样式 ‘o’(圆点)
    label 图列文字
    • marker相关参数:

      image-20221028111408749
    • 使用plt.legend(loc,fontsize)显示图例

      image-20221028111737941
  • 在指定位置添加文字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
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
import matplotlib.pyplot as plt
import numpy as np
#设置中文字体
plt.rcParams["font.sans-serif"]="SimHei"
plt.rcParams["axes.unicode_minus"]=False
#随机生成散点图数据:正态分布与均匀分布
n=1024
x1=np.random.normal(0,1,n)
y1=np.random.normal(0,1,n)
x2=np.random.uniform(-4,4,n)
y2=np.random.uniform(-4,4,n)
#绘制散点图
plt.scatter(x1,y1,color="blue",marker="*",label="正态分布")
plt.scatter(x2,y2,color="yellow",marker="o",label="均匀分布")
#设置标题
plt.title("标准分布",fontsize=20)
#设置坐标轴范围
plt.xlim(-4,4)
plt.ylim(-4,4)
#设置坐标轴标签
plt.xlabel("横坐标x",fontsize=14)
plt.ylabel("纵坐标y",fontsize=14)
#设置文本
plt.text(-3.8,3,"均 值:0 标准差:1\n均匀分布:[-4:4]")
#设置图例
plt.legend()

结果如下:

image-20221028111234270

3.折线图

plt.plot(x,y,color,marker,label,linewidth,markersize)

参数 说明 默认值
x 数据点的x坐标 0,1,2,……
y 数据点的y坐标 不可缺省
color 数据点的颜色
marker 数据点的样式 ‘o’(圆点)
label 图例文字
linewidth 折线的宽度
markersize 数据点的大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import matplotlib.pyplot as plt
import numpy as np
#设置中文字体
plt.rcParams["font.sans-serif"]="SimHei"
#随机生成数据点
n=24
y1=np.random.randint(27,37,n)
y2=np.random.randint(40,60,n)
#绘图
plt.plot(y1,label="温度")
plt.plot(y2,label="湿度")
#设置坐标轴
plt.xlim(0,23)
plt.ylim(20,70)
plt.xlabel("小时",fontsize=12)
plt.ylabel("测量值",fontsize=12)
#设置标题
plt.title("24小时温度湿度统计",fontsize=16)
#设置图例
plt.legend()
plt.show()

结果如下:

image-20221028113312696

4.柱状图

bar(left,height,width,facecolor,edgecolor,label)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np
#设置中文字体
plt.rcParams["font.sans-serif"]="SimHei"
plt.rcParams["axes.unicode_minus"]=False
#设置数据
y1=[32,25,16,30,24,45,40,33,28,17,24,20]
y2=[-23,-35,-26,-35,-45,-43,-35,-32,-23,-17,-22,-28]
#绘图
plt.bar(range(len(y1)),y1,width=0.8,facecolor="green",edgecolor="white",label="统计量1")
plt.bar(range(len(y2)),y2,width=0.8,facecolor="red",edgecolor="white",label="统计量2")
#设置标题
plt.title("柱状图",fontsize=20)
#添加图例
plt.legend()
plt.show()

结果如下:

image-20221028115614661

实例分析:波士顿房价数据集可视化

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
32
33
34
35
36
37
38
39
40
41
42
43
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
boston_housing = tf.keras.datasets.boston_housing
#x表示房屋的属性值,y表示房价
(train_x,train_y),(test_x,test_y)=boston_housing.load_data(test_split=0)#其中test_split为设置测试组数据所占比例,默认为0.2
#打印训练与测试数据的长度
print("The train:",len(train_x))
print("The test:",len(test_x))
#打印测试数据的数据类型
print(type(train_x))
print(type(train_y))
#打印测试数据的维度与形状
print("Dim of train_x:",train_x.ndim)
print("Shape of train_x:",train_x.shape)
print("Dim of train_y:",train_y.ndim)
print("Shape of train_y:",train_y.shape)
#输出train_x中的前5行数据
print("The train_x[0:5] is:\n",train_x[0:5])
#取出train_x中某一列的数据
print("The train_x[:,5] is:\n",train_x[:,5])

#绘制各个属性与房价的关系
#设置运行时参数
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
#子图的标题
titles=["CRIM","ZN","INDUS","CHAS","NOX","RM","AGE","DIS","RAD","TAX","PTRATIO","B-1000","LSTAT","MEDV"]
#设置绘图尺寸
plt.figure(figsize=(12,12))
#通过循环绘制散点图
for i in range(13):
plt.subplot(4,4,(i+1))
plt.scatter(train_x[:,i],train_y)
plt.xlabel(titles[i])
plt.ylabel("Price($1000's)")
plt.title(str(i+1)+"."+titles[i]+" - Price")
#调整子图间隔
plt.tight_layout()
#设置全局标题
plt.suptitle("各个属性与房价的关系",x=0.5,y=1.02,fontsize=20)
#显示绘图
plt.show()

部分结果如下:

image-20221028120441204

image-20221028120530479


附:相关网站

欢迎来到ssy的世界