深度学习1:Python基础库NumPy与Matplotlib

本文章知识来源于《深度学习入门》 (鱼书),特此声明。可以当做读数笔记来进行阅读。

NumPy

在深度学习的实现中,经常出现数组和矩阵的计算。NumPy的数组类 (numpy.array)中提供了很多便捷的方法,在实现深度学习时,我们将使用这些方法。

核心功能:

  1. 多维数组对象(ndarray) :所有元素类型相同,由dtype属性指定,如int32float64等,通过shape属性表示各维度大小,例如二维数组形状为(行数, 列数)元素在内存中连续存储,便于快速访问和运算
  2. **高效存储与计算:**基于C语言实现,数组存储紧凑,运算速度远超Python原生列表。支持向量化操作,避免显式循环,大幅提升代码简洁性和执行效率
  3. **广播机制:**支持不同形状数组间的运算,简化数据处理逻辑
  4. **丰富的数学函数库:**提供全面的数学函数,包括统计函数、线性代数函数、傅里叶变换等
  5. **集成性强:**与Pandas、SciPy、Matplotlib等库深度整合,是数据分析和机器学习的基础
shell 复制代码
pip install numpy
python 复制代码
import numpy as np
print(np.__version__) # 2.2.6

生成数组

python 复制代码
# 从列表创建一维数组
a = np.array([1, 2, 3, 4, 5])
 # [1 2 3 4]  type:<class 'numpy.ndarray'>
print(f'{a}  type:{type(a)}')

# 从列表创建二维数组
# [[1 2 3]
#  [4 5 6]]  type:<class 'numpy.ndarray'>
b = np.array([[1, 2, 3], [4, 5, 6]])
print(f'{b}  type:{type(b)}')

# 创建全零二维数组
#[[0. 0. 0.]
# [0. 0. 0.]]  type:<class 'numpy.ndarray'>
zeros = np.zeros((2, 3))
print(f'{zeros}  type:{type(zeros)}')

# 创建全一二维数组
#[[1. 1. 1.]
# [1. 1. 1.]
# [1. 1. 1.]]  type:<class 'numpy.ndarray'>
ones = np.ones((3, 3))
print(f'{ones}  type:{type(ones)}')

# 创建等差数列
arange = np.arange(start=0, stop=10, step=2)
# [0 2 4 6 8]
print(arange) 

# 创建随机数组
rand = np.random.rand(2, 2)
print(rand)

算数运算

python 复制代码
x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])

# 如果元素个数不同,程序就会报错
# "对应元素的"的英文是element-wise
x + y # 对应元素的加法 [ 3., 6., 9.]  
x - y # [ -1., -2., -3.]
x * y # [ 2., 8., 18.]
x / y # [ 0.5, 0.5, 0.5]

 x = np.array([1.0, 2.0, 3.0])
 x / 2.0 # [ 0.5, 1. , 1.5]  也叫做广播

N维数组

python 复制代码
 A = np.array([[1, 2], [3, 4]])
print(A)
# [[1 2]
#  [3 4]]

A.shape  # (2,2) 表示两行,两列的矩阵
A.dtype  # dtype('int64')

和数组的算术运算一样,矩阵的算术运算也可以在相同形状的矩阵间以

对应元素的方式进行。并且,也可以通过标量(单一数值)对矩阵进行算术运算。

这也是基于广播的功能

python 复制代码
A = np.array([[1, 2], [3, 4]])
B = np.array([[3, 0],[0, 6]])
A+B 
# array([[ 4, 2],
#        [ 3, 10]])

A*B
# array([[ 3, 0],
#        [ 0, 24]])

NumPy数组(np.array)可以生成_N_维数组,即可以生成一维数组、

二维数组、三维数组等任意维数的数组。数学上将一维数组称为向量,

将二维数组称为矩阵。另外,可以将一般化之后的向量或矩阵等统

称为张量(tensor)。

广播

NumPy中,形状不同的数组之间也可以进行运算。

python 复制代码
A = np.array([[1, 2], [3, 4]])
# 2*2 的矩阵A和标量10 做乘法运算
A*10

标量10 被扩展成了 2* 2 的形状,然后再与矩阵A进行乘法运算,这个功能称为 广播 (broadcast)

再看一个例子:

python 复制代码
A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
A*B
# array([[ 10, 40],
#        [ 30, 80]])

Matplotlib

在深度学习的实验中,图形的绘制和数据的可视化非常重要。Matplotlib是用于绘制图形的库,使用Matplotlib可以轻松地绘制图形和实现数据的可视化。

python 复制代码
"""
全局设置
"""
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

if __name__ == '__main__':
    # 创建一个绘图窗口, 宽 15英寸,高 10 英寸
    fig = plt.figure(figsize=(15, 10))
    # 顶部绘制文字,18号,加粗
    fig.suptitle('初中阶段基本函数图像', fontsize=18, fontweight='bold')

    # 使用GridSpec创建2x3的子图布局
    # 第一行: 一次函数,二次函数, 反比例函数
    # 第二行: 正比例函数,常数函数, 绝对值函数
    gs = gridspec.GridSpec(2, 3, figure=fig)

    # 1. 一次函数 y = 2x + 1
    plot_linear_function(gs)

    # 2. 二次函数 y = x²
    plot_quadratic_function(gs)

    # 3. 反比例函数 y = 1/x
    plot_inverse_proportion_function(gs)

    # 4. 正比例函数 y = x
    plot_proportion_function(gs)

    # 5. 常数函数 y = 3
    plot_constant_function(gs)

    # 6. 绝对值函数 y = |x|
    plot_absolute_value_function(gs)

    # 调整子图间距
    # rect=[0, 0, 1, 0.96] 定义了子图布局的矩形区域:
    # [左, 下, 右, 上] 分别对应矩形区域的边界
    # 0, 0 表示左侧和底部从0开始
    # 1, 0.96 表示右侧到1结束,顶部到0.96结束
    plt.tight_layout(rect=[0, 0, 1, 0.96])

    # 添加函数特点说明
    # 坐标(0.02, 0.02)表示文本左下角的位置(相对坐标,0-1之间)
    fig.text(0.02, 0.02,
             '初中阶段主要函数特点:\n'
             '1. 一次函数:直线,斜率为常数\n'
             '2. 二次函数:抛物线,开口方向由系数决定\n'
             '3. 反比例函数:双曲线,以坐标轴为渐近线\n'
             '4. 正比例函数:经过原点的直线\n'
             '5. 常数函数:平行于x轴的直线\n'
             '6. 绝对值函数:V形,关于y轴对称',
             fontsize=11,
             bbox=dict(boxstyle="round,pad=0.5", facecolor="lightyellow", alpha=0.8))

    plt.show()
python 复制代码
def plot_linear_function(gs):
    """
    绘制一次函数
    """
    # 定义x的取值范围
    x = np.linspace(-10, 10, 400)
    # 1. 一次函数 y = 2x + 1
    # gs 是一个 2*3 的布局,
    # fig.add_subplot(gs[0, 0]) 表示在 0行 0列 创建一个子图
    ax1 = fig.add_subplot(gs[0, 0])
    y = 2 * x + 1
    # 绘制一次函数图像,plot是: matplotlib中用于绘制线条图的方法
    # x: x轴坐标数据(-10到10的400个点)
    # y: y轴坐标数据(根据函数y = 2x + 1计算得出)
    # 'b-': 绘制样式,b表示蓝色(blue),-表示实线
    # linewidth=2: 线条宽度为2个像素
    # label='y = 2x + 1': 图例标签,显示函数表达式
    ax1.plot(x, y, 'b-', linewidth=2, label='y = 2x + 1')
    # 是matplotlib中用于绘制水平线的方法
    # y=0: 水平线的y坐标位置,在这里是在y=0的位置,即x轴位置
    # color='k': 线条颜色,'k'表示黑色(black)
    # linewidth=0.5: 线条宽度为0.5个像素
    # alpha=0.5: 线条透明度,0.5表示半透明
    ax1.axhline(y=0, color='k', linewidth=0.5, alpha=0.5)
    ax1.axvline(x=0, color='k', linewidth=0.5, alpha=0.5)
    # 标题
    ax1.set_title('一次函数', fontsize=14, fontweight='bold')
    ax1.set_xlabel('x')
    ax1.set_ylabel('y')
    # 设置x轴的最小值为-10,最大值为10
    ax1.set_xlim(-10, 10)
    # 设置y轴的最小值为-10,最大值为10
    ax1.set_ylim(-10, 10)
    # 为图表添加网格线:
    ax1.grid(True, alpha=0.3)
    # 显示图例,用于标识图表中的不同数据系列 指定图例显示在图表的左上角位置
    ax1.legend(loc='upper left')
    # 设置坐标轴的纵横比 'equal' 表示x轴和y轴的比例相等,即单位长度相同
    # adjustable='box' 表示通过调整坐标轴的边界框来保持比例
    ax1.set_aspect('equal', adjustable='box')
python 复制代码
def plot_quadratic_function(gs):
    """
     二次函数 y = x²
    :param gs:
    :return:
    """
    ax = fig.add_subplot(gs[0, 1])
    x = np.linspace(-10, 10, 400)
    y = x ** 2
    ax.plot(x, y, 'r-', linewidth=2, label='y = x²')
    ax.axhline(y=0, color='k', linewidth=0.5, alpha=0.5)
    ax.axvline(x=0, color='k', linewidth=0.5, alpha=0.5)
    ax.set_title('二次函数', fontsize=14, fontweight='bold')
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    # x 轴的最小值为-5,最大值为5
    ax.set_xlim(-5, 5)
    # y 轴的最小值为-2,最大值为10
    ax.set_ylim(-2, 10)
    ax.grid(True, alpha=0.3)
    ax.legend(loc='upper center')
    ax.set_aspect('equal', adjustable='box')
python 复制代码
def plot_inverse_proportion_function(gs):
    """
     正比例函数 y = x
    :param gs:
    :return:
    """
    ax = fig.add_subplot(gs[0, 2])

    # 创建从-10到-0.1的200个均匀分布的数据点 避开x=0点,防止除零错误
    x_begin=np.linspace(-10, -0.1, 200)
    # 创建从0.1到10的200个均匀分布的数据点 同样避开x=0点
    x_end=np.linspace(0.1, 10, 200)
    # 使用 np.concatenate 将 x_begin 和 x_end 两个数组连接成一个完整的数组
    x = np.concatenate([x_begin,x_end ])
    y = 1 / x
    # g表示green
    ax.plot(x, y, 'g-', linewidth=2, label='y = 1/x')
    ax.axhline(y=0, color='k', linewidth=0.5, alpha=0.5)
    ax.axvline(x=0, color='k', linewidth=0.5, alpha=0.5)
    ax.set_title('反比例函数', fontsize=14, fontweight='bold')
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_xlim(-10, 10)
    ax.set_ylim(-10, 10)
    ax.grid(True, alpha=0.3)
    ax.legend(loc='upper left')
    ax.set_aspect('equal', adjustable='box')
python 复制代码
def plot_proportion_function(gs):
    """
     正比例函数 y = x
    :param gs:
    :return:
    """
    x = np.linspace(-10, 10, 400)
    ax = fig.add_subplot(gs[1, 0])
    y = x
    ax.plot(x, x, 'm-', linewidth=2, label='y = x')
    ax.axhline(y=0, color='k', linewidth=0.5, alpha=0.5)
    ax.axvline(x=0, color='k', linewidth=0.5, alpha=0.5)
    ax.set_title('正比例函数', fontsize=14, fontweight='bold')
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_xlim(-10, 10)
    ax.set_ylim(-10, 10)
    ax.grid(True, alpha=0.3)
    ax.legend(loc='upper left')
    ax.set_aspect('equal', adjustable='box')
python 复制代码
def plot_constant_function(gs):
    """
     常数函数 y = 3
    :param gs:
    :return:
    """
    ax = fig.add_subplot(gs[1, 1])
    x = np.linspace(-10, 10, 400)
    # x所有元素都等于1
    y = np.ones_like(x) * 3
    ax.plot(x, y, 'c-', linewidth=2, label='y = 3')
    ax.axhline(y=0, color='k', linewidth=0.5, alpha=0.5)
    ax.axvline(x=0, color='k', linewidth=0.5, alpha=0.5)
    ax.set_title('常数函数', fontsize=14, fontweight='bold')
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_xlim(-10, 10)
    ax.set_ylim(-5, 5)
    ax.grid(True, alpha=0.3)
    ax.legend(loc='upper right')
    ax.set_aspect('equal', adjustable='box')
python 复制代码
def plot_absolute_value_function(gs):
    """
     绝对值函数 y = |x|
    :param gs:
    :return:
    """
    ax = fig.add_subplot(gs[1, 2])
    x = np.linspace(-10, 10, 400)
    y = np.abs(x)
    ax.plot(x, y, 'y-', linewidth=2, label='y = |x|')
    ax.axhline(y=0, color='k', linewidth=0.5, alpha=0.5)
    ax.axvline(x=0, color='k', linewidth=0.5, alpha=0.5)
    ax.set_title('绝对值函数', fontsize=14, fontweight='bold')
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_xlim(-10, 10)
    ax.set_ylim(-2, 10)
    ax.grid(True, alpha=0.3)
    ax.legend(loc='upper center')
    ax.set_aspect('equal', adjustable='box')
相关推荐
深耕AI2 小时前
【已解决】PyCharm中使用uv创建项目时Python安装失败的问题
python·pycharm·uv
深度学习实战训练营2 小时前
Mask2Former:用于通用图像分割的掩码注意力掩码变换器,通用分割架构(语义!实例!全景)-k学长深度学习专栏
人工智能·深度学习
灰色人生qwer2 小时前
git add . 添加超长文件名报错了怎么办?
git·python·elasticsearch
飞天小蜈蚣2 小时前
django的ulr注意事项、模板渲染
python·django·sqlite
roman_日积跬步-终至千里2 小时前
【计算机视觉(15)】语义理解-深度学习工程_CPU_GPU_自动求导_框架
人工智能·深度学习·计算机视觉
2301_764441332 小时前
Python实现深海声弹射路径仿真
python·算法·数学建模
其美杰布-富贵-李2 小时前
Conv1d(一维卷积)深度学习学习笔记
笔记·深度学习·学习
Accelemate2 小时前
[故障复盘] PyCharm 远程开发:中文文件名“隐身”与无法创建文件的排查
ide·python·pycharm
CodeCraft Studio2 小时前
国产化Excel开发组件Spire.XLS教程:以Python编程方式在Excel中高亮重复值
开发语言·python·excel·spire.xls·excel自动化·excel高亮重复值·python处理excel