机器人自学之路笔记P2——前置知识:NumPy

机器人自学之路笔记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 ,出现下面的内容就是安装好了

在这里插入图片描述

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() 矩阵相加

  • 使用 asarrayarray 的区别(不懂可以先跳过,用两个都可以):

    • 当使用 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博客,对矩阵的学习更进一步,这节还是在磨刀,不费砍柴功。知只提到了常用的简单内容,没有什么难点,这些内容都是后面需要经常用到的。下一节我们将真正开始应用矩阵来描述机器人的位姿,这是机器人运动学的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值