机器人自学之路笔记P2——前置知识:NumPy
作者:开挖机的程序猿
本文作于 2024-8-15
一、前言
-
上一篇笔记讲了矩阵的基本概念以及矩阵的基本运算,还不会的读者可以移步:机器人自学之路笔记P1——前置知识:矩阵-CSDN博客
-
上一篇主要是带大家了解矩阵运算的算法,但是我们在研究机器人的过程中不可能用手去计算矩阵,这样太慢,而且累,也容易出错,实时性基本没有,所以本文开始带大家用 Python 的 NumPy 库进行一些矩阵的基本运算求解
-
这一章同样,属于扫盲知识,不会太深入,会用即可,已经会的可以跳过本章
二、NumPy
1、什么是NumPy?(AI介绍)
NumPy 是一个开源的 Python 科学计算库,它提供了多维数组对象、派生对象(如掩码数组和矩阵)以及用于快速操作数组的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅立叶变换、基本线性代数、基本统计运算、随机模拟等等。
NumPy 的主要特点包括:
- 强大的 N 维数组对象 ndarray,支持大量的维度数组和矩阵运算。
- 广播功能,允许 NumPy 用不同大小的数组进行算术运算。
- 集成 C/C++ 代码的能力,使得 NumPy 在执行数组运算时非常快速。
- 丰富的库支持,包括线性代数、傅里叶变换和随机数生成等。
NumPy 是许多其他科学计算和数据分析库的基础,例如 Pandas、SciPy 和 scikit-learn。
2、如何获取NumPy?
1、创建Python环境,可以是Conda环境,也可以是系统全局Python,版本没有强制要求,Python3即可,但是作者建议使用3.9及以上的版本,由于目前只需要运行Python脚本,并不需要安装许多包,也就不太需要独立的环境,所以没必要安装Conda,大家可以自行了解。作者这里带大家在WIN11上安装一下Python3
-
开魔法访问这个网址Python Release Python 3.12.5 | Python.org,这个是目前为止的最新版,这个版本在这里不是很重要
-
下拉到底,找到
Windows installer (64-bit)
,点击下载
- 下载完成后安装,记得勾选
Add python.exe to PATH
,直接将python添加进系统环境变量,这样你才可以在任意位置运行python
- 然后可以直接点击
Install Now
,如果提示要允许安装就点允许,没有就不管,然后等待就行,这个安装是直接帮你配置好然后安装到C盘,如果你想更改安装位置,点击下面的Customize installation
,Next 到选择路径,作者安装在D盘的自建目录python312
下,同时为所有用户安装了python
- 安装成功,接下来测试一下,
win
键 +R
键调出运行
窗口,输入CMD
打开终端,终端内输入python
,出现下面的内容就是安装好了
-
如果提示
系统找不到文件python.exe
,请去控制面板卸载刚刚安装的python312,然后重新按照上面的方法安装一边,一定要记得勾选Add python.exe to PATH
,或者不重新安装,参考这篇文章去添加环境变量:python手动添加环境变量(超详细)(只适用win11/win10/win8,win7用户请绕行)_python添加环境变量-CSDN博客 -
至此,Python环境创建好了
2、使用 pip
安装 numpy
-
pip 是 python 的包管理工具,可以通过 pip 很方便地安装 python 包
-
打开终端,先检查pip是否正确安装以及版本:输入
pip --version
pip --version
C:\Users\22283>pip --version
pip 24.2 from D:\python312\Lib\site-packages\pip (python 3.12)
-
返回的信息有 pip 版本号
24.2
,是哪一个已安装的 python 提供的D:\python312\Lib\site-packages\pi
以及对应的 pyhton版本(python 3.12
-
注意,如果你的电脑上存在多个python,可以先用
where python
命令查看所有在系统环境变量里的 python 版本,系统终端的选择逻辑是,在系统环境变量配置里,谁在前排,就优先指定谁
C:\Users\22283>where python
D:\python312\python.exe
D:\Anaconda\python.exe
C:\Users\22283\AppData\Local\Microsoft\WindowsApps\python.exe
-
PS:可以看到,作者电脑上存在三个 python 环境,分别是刚刚安装的 python312,Anaconda提供的 python,还有通过 window app 商店安装的 python,它们都提供了对应的 pip 工具,但是工具版本不同,安装的应用包版本也会不同,存放的位置也会不同,作者原来使用的是位于C盘的应用商店安装的 python,导致C盘空间被 python 包大量占用,所以推荐重新安装一个 python 环境在其他盘,对应的 pip 安装目录也就转移了,也不会导致和其他的 python 包冲突
-
确定好 pip 信息后使用 pip 安装 numpy,这里作者直接用这个版本的 pip,在这里这个不重要
pip install numpy
C:\Users\22283>pip install numpy
Collecting numpy
Downloading numpy-2.0.1-cp312-cp312-win_amd64.whl.metadata (60 kB)
Downloading numpy-2.0.1-cp312-cp312-win_amd64.whl (16.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.3/16.3 MB 493.8 kB/s eta 0:00:00
Installing collected packages: numpy
Successfully installed numpy-2.0.10:25
-
这样就安装好了(开了魔法)
-
但是有时候会因为网络问题提示
WARNING: Retrying (Retry(total=4, connect=None, read=None,
redirect=None, status=None)) after connection broken by
'ProxyError('Cannot connect to proxy.', NewConnectionError
('<pip._vendor.urllib3.connection.HTTPSConnection
object at 0x000002536F65C650>: Failed to establish a new connection:
[WinError 10061] 由于目标计算机积极拒绝,无法连接。'))': /simple/numpy/
- 使用这条命令从清华源下载
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
- 安装完成后验证一下:终端进入python,导入numpy并查看版本信息
C:\Users\22283>python
Python 3.12.5 (tags/v3.12.5:ff3bc82, Aug 6 2024, 20:45:27) [MSC v.1940 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy .__version__
'2.0.1'
>>>
- 至此你就安装好了 numpy,在 python 解释器下(>>>)用 exit() 函数退出
三、jupyter——工欲善其事,必先利其器
-
作者又要啰嗦了,上面安装好了numpy,开始动手试一试吧,但是通过传统的运行脚本的方式效率太低了,你想看到结果还得手动 print ,所以作者推荐大家使用这个叫 jupyter 的工具去进行代码学习,可视性和交互性很高
-
(AI介绍)Jupyter是一个开源的Web应用程序,允许用户创建和共享包含实时代码、方程、可视化和解释性文本的文档。它广泛用于数据清洗和转换、数值模拟、统计建模、机器学习等领域。Jupyter的主要特点包括:
-
交互式编程:用户可以在Jupyter笔记本中直接编写和运行代码,实时看到结果。
-
多语言支持:最初支持Python,但现在已经扩展到支持超过40种编程语言,包括R、Julia和Scala。
-
丰富的文档:Jupyter笔记本可以包含Markdown、LaTeX等格式的文本,使得文档既美观又具有交互性。
-
易于分享:Jupyter笔记本文件(通常是
.ipynb
格式)可以轻松地在用户之间共享和协作。 -
集成开发环境:Jupyter提供了代码补全、错误检查等IDE功能,使得编程更加高效。
-
社区驱动:Jupyter由一个活跃的社区维护和发展,不断有新的功能和改进被加入。
Jupyter的核心组件包括Jupyter Notebook服务器、JupyterLab(一个更现代的界面,提供了更丰富的功能和更好的用户体验)以及IPython(一个增强的Python解释器)等。
-
-
使用 pip 安装 jupyter-notebook
pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
- 然后等待就行了,安装完使用下面的命令启动
jupyter-notebook
-
加载完毕后会弹出一个网页,如果你安装了vscode会弹出一段 html 文件,打开包含的链接即可
-
在网页页面的右上角点击New ----> Python3
-
进入工作区后可以在这个框框里执行终端命令(指令前面要加英文感叹号
!
) -
直接执行单句 python 代码或多句 python 脚本,并实时看到结果输出
四、Numpy创建矩阵实操(动手做一做)
- 作者写文章都是自己做过的,心里明白怎么做,但是如果读者光看不做是很难学会技能的哦,这些并不复杂。要看,做,记,大家看会了,做会了,才是学会了,然后再总结拓展,发博客去指引更多学者吧!
1、导入numpy库
-
要使用numpy进行矩阵运算,你得首先在环境中导入安装好的numpy库
-
输入下面的 python 代码行,并点击jupyter工具栏的
运行
import numpy as np
- 这句代码的意思是导入numpy库,并起个方便使用的名称
np
2、创建一个三阶单位矩阵
- 另起一行,输入下面的代码行来创建一个三阶单位矩阵(传的参数就是几阶矩阵)
np.identity(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
- 尝试创建一个二阶矩阵吧!
3、创建一个 3 x 3 零矩阵
- 另起一行,输入下面的代码行来创建一个3x3零矩阵(传的参数就是矩阵形状,这里要传入一个数对,用中括号括起来,逗号分隔)
np.zeros([3,3])
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
- 试试创建别的形状的零矩阵
4、创建一个 2 x 3 随机矩阵
np.random.rand(3,3)
array([[0.55655207, 0.26795032, 0.91922799],
[0.66096531, 0.03628715, 0.21136484],
[0.12644681, 0.6130859 , 0.59766942]])
5、用已有数据创建一个自定义矩阵
- 直接使用
np.array
指定一个矩阵
np.array([[5, 6, 8],
[1, 8, 7],
[2, 6, 3]])
array([[5, 6, 8],
[1, 8, 7],
[2, 6, 3]])
6、还有更多类型矩阵的创建方法,后面遇到再说
五、Numpy矩阵运算实操(动手做一做)
1、.reshape() 矩阵变形
-
矩阵(Matrix),为什么在numpy中却用 “array” (数组)来表示?其实我们可以说,numpy的矩阵就是一个存储了多个数组的数组,是一个二维数据分布的变量,从上面的矩阵结果来看也是这样的
-
也有关于“矩阵是一个多维数组”的说法,不过作者不敢苟同,矩阵一般是二维的(只有行和列),和维度相关的一般叫张量,维度和张量的关系一般这么规定:0维的张量就是标量,1维的张量就是向量,2维的张量就是矩阵,大于等于3维的张量没有名称,统一叫做张量。张量、矩阵和向量区别_张量和向量的区别-CSDN博客
-
我们可以对矩阵的二维特征(行和列)进行“重塑变形”,使用 numpy 的
reshape()
函数
np.array([[5, 6, 8],
[1, 8, 7],
[2, 6, 3]]).reshape(1,9)
array([[5, 6, 8, 1, 8, 7, 2, 6, 3]])
-
这样就把这个 3x3 的矩阵转换成了 1x9的矩阵了
-
试试再转换回去
-
如果元素数量对不上,是无法进行转换的
np.array([[5, 6, 8],
[1, 8, 7],
[2, 6, 3]]).reshape(2,4)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[14], line 3
1 np.array([[5, 6, 8],
2 [1, 8, 7],
----> 3 [2, 6, 3]]).reshape(2,4)
ValueError: cannot reshape array of size 9 into shape (2,4)
2、np.allclose() 矩阵对比
- numpy的
allclose()
函数,比较两个array是不是每一元素都相等,默认在1e-05的误差范围内
A = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
B = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
np.allclose(A,B)
True
- 不一样则返回 False
A = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
B = np.array([[11, 12, 13],
[14, 5, 16],
[17, 18, 9]])
np.allclose(A,B)
False
3、np.add() 矩阵相加
-
使用
asarray
和array
的区别(不懂可以先跳过,用两个都可以):-
当使用
array
函数时,默认情况下,如果输入数据已经是一个 NumPy 数组,它会创建这个数组的一个新副本。 -
asarray
函数在处理已经为 NumPy 数组的输入时,不会创建数据的副本,而是直接返回输入数组本身。这可以节省内存和时间,特别是当处理大型数组时。
-
-
add()
函数:
A = np.asarray([5,2,7,5,6,4,8,2,4]).reshape(3,3)
B = np.asarray([4,1,9,3,1,0,6,2,2]).reshape(3,3)
np.add(A,B)
array([[ 9, 3, 16],
[ 8, 7, 4],
[14, 4, 6]])
4、np.dot() 矩阵相乘
- 矩阵点乘(对应位相乘),简单,不做解释
A = np.asarray([5,2,7,5,6,4,8,2,4]).reshape(3,3)
B = np.asarray([4,1,9,3,1,0,6,2,2]).reshape(3,3)
A*B
array([[20, 2, 63],
[15, 6, 0],
[48, 4, 8]])
- A x B 矩阵叉乘,使用 numpy
dot()
函数
A = np.asarray([5,2,7,5,6,4,8,2]).reshape(2,4)
B = np.asarray([4,1,9,3,1,0,6,2]).reshape(4,2)
np.dot(A,B)
A矩阵:
[[5 2 7 5]
[6 4 8 2]]
B矩阵:
[[4 1]
[9 3]
[1 0]
[6 2]]
A X B:
array([[75, 21],
[80, 22]])
- B x A
A = np.asarray([5,2,7,5,6,4,8,2]).reshape(2,4)
B = np.asarray([4,1,9,3,1,0,6,2]).reshape(4,2)
np.dot(B,A)
A矩阵:
[[5 2 7 5]
[6 4 8 2]]
B矩阵:
[[4 1]
[9 3]
[1 0]
[6 2]]
B X A:
array([[26, 12, 36, 22],
[63, 30, 87, 51],
[ 5, 2, 7, 5],
[42, 20, 58, 34]])
5、.T 矩阵转置
- 使用 numpy 的
.T
方法
A = np.asarray([5,2,7,5,6,4,8,2]).reshape(2,4)
print("A矩阵:")
print(A)
print("A矩阵转置:")
A.T
A矩阵:
[[5 2 7 5]
[6 4 8 2]]
A矩阵转置:
array([[5, 6],
[2, 4],
[7, 8],
[5, 2]])
6、np.linalg.inv() 计算逆矩阵
- 使用
np.linalg.inv()
计算逆矩阵,传入矩阵为方阵
A = np.asarray([5,7,4,2,1,6,3,1,5]).reshape(3,3)
print("A矩阵:")
print(A)
print("A矩阵的逆矩阵:")
np.linalg.inv(A)
A矩阵:
[[5 7 4]
[2 1 6]
[3 1 5]]
A矩阵的逆矩阵:
array([[-0.0212766 , -0.65957447, 0.80851064],
[ 0.17021277, 0.27659574, -0.46808511],
[-0.0212766 , 0.34042553, -0.19148936]])
- 如果矩阵不存在逆矩阵,则会报错,下面这个矩阵的行列式为0
A = np.asarray([1,2,1,2,4,2,1,2,1]).reshape(3,3)
print("A矩阵:")
print(A)
print("A矩阵的逆矩阵:")
np.linalg.inv(A)
A矩阵:
[[1 2 1]
[2 4 2]
[1 2 1]]
A矩阵的逆矩阵:
---------------------------------------------------------------------------
LinAlgError Traceback (most recent call last)
Cell In[41], line 5
3 print(A)
4 print("A矩阵的逆矩阵:")
----> 5 np.linalg.inv(A)
File D:\python312\Lib\site-packages\numpy\linalg\_linalg.py:608, in inv(a)
605 signature = 'D->D' if isComplexType(t) else 'd->d'
606 with errstate(call=_raise_linalgerror_singular, invalid='call',
607 over='ignore', divide='ignore', under='ignore'):
--> 608 ainv = _umath_linalg.inv(a, signature=signature)
609 return wrap(ainv.astype(result_t, copy=False))
File D:\python312\Lib\site-packages\numpy\linalg\_linalg.py:104, in _raise_linalgerror_singular(err, flag)
103 def _raise_linalgerror_singular(err, flag):
--> 104 raise LinAlgError("Singular matrix")
LinAlgError: Singular matrix
六、总结
本文主要是接着上一篇文章机器人自学之路笔记P1——前置知识:矩阵-CSDN博客,对矩阵的学习更进一步,这节还是在磨刀,不费砍柴功。知只提到了常用的简单内容,没有什么难点,这些内容都是后面需要经常用到的。下一节我们将真正开始应用矩阵来描述机器人的位姿,这是机器人运动学的基础。