参考链接: C 程序使用多维数组将两个矩阵相乘
知乎专栏:[代码家园工作室分享]收藏可了解更多的编程案例及实战经验。问题或建议,请留言;
简述
Matlab与NumPy/SciPy在功能实现上有很多相似之处。但在代码编译方面还有一些不同。NumPy与SciPy旨在基于Python下,通过最简单,自然的方式实现数学与科学计算,并非Matlab的简单复刻。本章我们从矩阵运算模块出发,对比Python与Matlab在实现矩阵创建与运算时的异同,以帮助习惯使用Matlab的用户快速熟悉并应用NumPy/SciPy库。
array还是matrix?哪个更好用?
NumPy提供了array与matrix两个类用于矩阵运算。array类可以用来处理各种n维数组的数学运算,而matrix类则是专用来进行二位矩阵运算的。这两种类只有以下几个微小的差异。用哪种类进行定义矩阵更好一些呢?
Numpy的开发者团队推荐我们使用array类进行矩阵运算,简要原因如下:
arrays是numpy库针对矢量/张量/矩阵定义的标准类。大多数Numpy返回的内容是array而非matrices类。array类进行元素间智能运算的代码与进行线性代数运算有着明显区别。Python 3.5以后NumPy支持使用 ‘@’ 符号进行矩阵点乘操作后续Numpy考虑删去np.matrix并将其统一到array类下。
matrix类矩阵运算的部分操作与matlab更相近,下面的对比演示中我们会展示matlab/array/matrix三者在矩阵定义及运算中的异同。
矩阵定义运算实例展示
我们来列举一些常用的矩阵运算操作,对比其在Python_np,array,Python_np.matrix,Matlab上的实现方式
矩阵赋值
创建矩阵
-Python_np,array
import numpy
-Python_np.matrixmatrix定义二维矩阵的方式有以下两种
import numpy
-Matlab
A=[ 1 2 3 ; 4 5 6 ; 7 8 9 ]
矩阵元素检索
如何读取矩阵中某行某列的数值,如在以上矩阵中我们要识别第二行,第三列的数值-PythonPython的序列中各元素被视为第0个,第1个,第2个……接上段程序,此操作matrix类与array类并无区别。
1,
Matlab的序列中各元素被视为第1个,第2个,第3个……
a23=A(2,3)
矩阵点乘与元素智能相乘
元素智能相乘即矩阵中各素分别对应相乘-Python_np.array
#矩阵点乘,适用于Python 3.5以上版本
-Python_np.martix
#矩阵点乘
-Matlab
B=A*A %矩阵点乘B=A.*A %矩阵元素智能相乘
快捷操作
array可以使用.T快捷的实现矩阵转置,matrix可以使用.H,.I快捷的实现共轭转置矩阵及逆矩阵的求取。
-Python_np.array
#矩阵转置
-Python.np.matrix
#矩阵转置
-Matlab
AT=A.' %矩阵转置ACT=A' %求共轭转置矩阵AI=inv(A) %矩阵求逆
matrix与array的其他差异
-生成向量Matrix只能生成二维数组,array可以生成任何维度的数组。需要注意的是array生成的1维数组在进行矩阵点乘时,会视其在乘号左侧或右侧转化为对应的1xN或Nx1的矩阵。matrix则无法自动转化。
此外由于在array中1xN数组为1维数组,其无法通过上述.T或np.transpose()操作转置成如Nx1矩阵(由于点乘时会自动变形,针对其的转置使用场景不多)。
import numpy
输出结果分别如下
1
所以在针对一维array数组进行转置操作时应该参考如下代码:
import numpy
matrix与array类的优劣总结
array
√实现元素智能相乘更容易:A*B
x执行矩阵点积运算需要使用@:A@B
√对于一维array数组,在执行矩阵点积运算时,一维数组会视需要自动调整成所需的1xN或Nx1的矩阵,非常方便。
√array是NumPy的默认类,在程序编写中得到了最多的测试,使用第三方代码时输入输出也多为此类。
√可以支持多维运算
√语法表述与张量运算更接近
√所有运算( , - , * , / 等)与智能元素运算均一致。
x与scipy.sparse共用时不太方便
matrix
√矩阵赋值更接近于Matlab
x最多支持二维矩阵
x最小支持二位矩阵,无法定义向量,只能定义单行或单列矩阵。
x由于array是Numpy默认的类,部分第三方函数在输入matrix时也可能返回array类。
√A*B进行点积更接近于线性代数的表达。
x进行智能元素相乘时相对复杂,需要写成multiply(A,B)代码.
x进行智能元素计算时逻辑有点混乱,”/”执行智能元素计算,而星号执行向量点积。
√与scipy.sparse共用时代码相对简洁
商业推广
商业合作请进入淘宝店铺代码家园下单,硕博团队为大家提供涵盖深度学习,硬件开发,机械仿真,网页/应用开发等内容的定制化服务,新增Matlab代码转python服务,本团队具备规范化的服务流程与一对一的专业人员配置,保障高质高效服务用户需求。
图注:代码家园淘宝店