今天打算学一点就写一点,不然全部堆积到晚上压力太大了,有些东西写不完就要睡觉了💤
1. 什么是numpy?
1.1 numpy简介
是Python中的用于科学计算的库,提供高性能的多维数组对象和对应的操作函数,用于处理大型数据集和执行数值计算任务。
numpy的主要功能包含:
- 多维数组对象:NumPy引入了一种称为ndarray(N-dimensional array,多维数组)的对象,可以表示具有相同数据类型的多维数组。它提供了对数组进行快速操作和高效存储的功能。
- 数组操作:NumPy提供了丰富的数组操作函数,包括数学运算、统计分析、线性代数、傅里叶变换、随机数生成等。这些操作函数能够高效地处理大规模数据集,并提供了广播(broadcasting)功能,使得数组之间的运算更加方便。
- 数组索引和切片:NumPy支持灵活的数组索引和切片操作,可以通过指定索引或切片范围来获取数组的子集。这使得对数组的数据进行选择、修改和处理变得更加方便。
- 数组的存储和读取:NumPy提供了各种方法用于将数组保存到磁盘或从磁盘读取数组数据。支持的文件格式包括文本文件、二进制文件和压缩文件等。
值得注意的是,numpy的底层是c语言编写的,这表明其具备高度优化的运算性能。numpy同时还是许多数据分析和机器学习库的基础,如SciPy、Pandas和Scikit-learn等。
1.2 广播机制
这里解释一下上述第二点提到的numpy提供的广播机制:
NumPy的广播(Broadcasting)机制是一种灵活的规则,它允许在不同形状的数组之间进行算术运算。当进行操作的数组具有不同的形状时,广播机制会自动调整数组的维度,使它们具有兼容的形状,以便进行元素级的运算。
广播机制的主要目的是为了避免显式地进行数组形状的重复和复制操作。它可以在不增加数组的存储开销的情况下,实现对不同形状数组的元素级操作,提高了代码的简洁性和效率。
广播机制遵循以下规则:
- 数组的维度会自动调整为最大维度的数组的维度数。
- 在任何维度上,如果一个数组的大小为1,而另一个数组的大小大于1,那么在该维度上,具有大小为1的数组会被扩展为与具有较大大小的数组具有相同的大小。
- 如果两个数组在某个维度上的大小不相等,且都不为1,那么在该维度上,两个数组都不能进行广播,将会引发错误。
那为什么要提出广播机制呢?好处如下:
- 简化代码:广播机制允许在不同形状的数组之间进行元素级的运算,避免了手动进行形状重复和复制的操作,简化了代码的编写和维护。
- 减少内存开销:广播机制不会创建新的数组副本,而是通过重复使用已有数组的数据进行计算,减少了内存的占用和开销。
- 提高性能:通过避免显式的形状调整和复制操作,广播机制能够提高计算的效率,尤其在处理大规模数据集时具有明显的优势。
2. 如何跑通李沐老师在d2l上的代码?
2.1 第一步
如果事先没有运行conda,那就先cd到conda安装的路径下,执行conda init命令:
~/miniconda3/bin/conda init
注意这里前面的miniconda3/bin只是示例,具体要以自己电脑上的安装路径为准。
2.2 第二步
如果没有报错,控制台会提示关闭当前shell,就直接关掉即可,第二次打开即可生效。
第二次打开后,输入命令:
conda create --name d2l python=3.9 -y
这表示创建一个名为d2l的环境,使用的是3.9Python版本。
然后就会出现下面的情况:
等待安装完成即可。
2.3 第三步
现在只需要输入:
conda activate d2l
即可完成环境激活
2.4 第四步
输入:
jupyter notebook
找到d2l-zh对应的路径,即可跑通李沐老师的代码。
在jupyter里面修改代码,点击运行可以实时查看到结果,对于动手写代码、初学者是非常友好的。
3. ARM处理器的7种工作模式
ARM微处理器主要支持7种运行模式:
- 用户模式usr
- 系统模式sys
- 快中断模式fiq
- 外部中断模式irq
- 管理模式svc
- 数据访问终止模式abt
- 未定义指令终止模式und
详细解释如下图所示:
有下面几点需要注意:
- 上述7种状态,除了用户模式之外,都是特权模式
- 快中断、中断、管理、终止、未定义这五种都是异常模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。
4. ARM的两种工作状态
上述7种是ARM的工作模式,而ARM同时也有两种工作状态:thumb和arm状态。
- thumb:处理器执行16位的thumb指令,要求半字对齐
- arm:处理器执行32位的arm指令,要求字对齐。一个字4个字节,32位
那为什么要设置这两个工作状态呢?
因为不同的指令具有不同的特点,arm指令更长,适合计算能力需求较高的场景;而thumb的指令较短,可以减少存储空间,降低功耗提高性能。
在程序执行的过程中,两种状态可以随时切换,通过BX指令,根据操作数寄存器的最低位是0还是1来判断进入arm还是thumb。
BX R0
- R0的最低位[0]为1时,从arm切换到thumb
- R0的最低位[0]为0时,从thumb切换到arm
注意,异常情况下,只能处在arm状态。