MATLAB 用户的 Python
当我们从学术界转向行业,特别是工程专业人士时,我们面临着一个非常普遍的问题,那就是我们主要学习的是过时或即将过时的技术。例如,许多学校仍在使用 MATLAB。在工程领域,无论是化学工程师、电气工程师还是纳米工程师,每个人都必须使用过 MATLAB。
但在最近,我们可以看到企业正在从 MATLAB 转向 Python。这可能是由于各种原因造成的 -
1000 美元的许可证费用
内存分配效率低下
开源库匮乏
讨厌 MATLAB 语法。
想要从 MATLAB 切换到 Python 的人不必过于担心,因为它们的语法非常相似。
让我们针对 MATLAB 用户介绍 Python 的基础知识,重点关注数据分析和可视化。
矩阵用户的工具
NumPy 包含一些功能,使使用矩阵类型变得更容易,这应该有助于 MATLAB 的转换。
现在有一个 **matlib** 模块,其中包含用于流行数组构造器的矩阵,例如
zeros(), ones(), empty(), rand(), eye(), and repmat()
由于 mat 是 asmatrix 而不是矩阵的同义词,因此现在可以将数组转换为矩阵而无需复制数据。
一些顶级函数已被删除。例如,必须将 *numpy.rand()* 访问为 *numpy.random.rand()*。或者,使用 matlib 模块的 *rand()* 方法。但是,使用 *numpy.random.random()* 是“NumPythonic”方法,它与其他 NumPy 函数一样,接受一个元组作为形状。
对于那些理解简单 MATLAB 语法的人,我们可以使用以下方法 -
mat = np.matrix('2,6,3; 0,2,5; 1,7,4')
但在 Python 逻辑中,我们使用向量或列表。因此,以下语法将等效 -
mat = np.matrix([[2,6,3], [0,2,5], [1,7,4]])
使用 Python 语言语法,我们可以轻松遍历并获取值。
例如,
示例
如果我们想获取第一个,即 (0,0) 值,我们可以简单地写 *mat[0,0]*
import numpy as np mat = np.matrix([ [2,6,3], [0,2,5], [1,7,4] ]) print(mat[0,0])
输出
2
示例
第一列可以访问为 *mat[: , 0]* -
import numpy as np mat = np.matrix([ [2,6,3], [0,2,5], [1,7,4] ]) print(mat[: , 0])
输出
[[2] [0] [1]]
示例
仅访问第一行 -
import numpy as np mat = np.matrix([ [2,6,3], [0,2,5], [1,7,4] ]) print(mat[0,:])
输出
[[2 6 3]]
MATLAB-NumPy 等价物
子矩阵
可以使用 **ix_** 命令使用索引列表将数据分配给子矩阵。
例如,可以输入
index=[1,2]; matrix[np.ix_(index,index)]+=100
对于二维数组矩阵。
示例
import numpy as np mat = np.matrix([ [2,6,3], [0,2,5], [1,7,4] ]) index=[1,2]; mat[np.ix_(index,index)]+=100 print(mat)
输出
[[ 2 6 3] [ 0 102 105] [ 1 107 104]]
帮助
虽然 MATLAB 缺少 *which* 命令的直接等价物,但 *source* 和 *help* 命令通常会显示存储函数的位置的文件名。
此外,Python 包含一个 *inspect* 模块(要使用此模块,请导入 inspect),它提供了一个通常有功能的 getfile。
索引
任何数组/序列的第一个元素的索引为 1,因为 MATLAB 使用基于 1 的索引。
任何数组/序列的第一个元素的索引为零,因为 Python 使用基于 0 的索引。
范围
在 Python 中,像 0:5 这样的构造只能用作切片索引;在 MATLAB 中,0:5 可以用作“切片”索引(在方括号内)和范围文字(在括号内)。
因此,开发了古怪的 *r_ 对象*,以便 NumPy 能够具有类似的简洁范围创建方法。
因为 r_ 对象使用方括号进行索引,而不是像函数或函数 Object() { [native code] } 一样被调用,所以在参数中可以使用切片语法。
逻辑运算
在 MATLAB 中,| 和 & 是逻辑 AND/OR,而在 NumPy 中,& 或 | 是按位 AND/OR。
任何具有大量编程知识的人都可以区分这些差异。
尽管两者看起来功能相同,但存在重大差异。
以下是 NumPy 和 MATLAB 中 & 和 | 运算符的一些关键区别 -
形式为 0,1 的非逻辑输入:NumPy 的输出 = 输入的按位 AND。
MATLAB 返回逻辑 AND 并将任何非 0 值视为 1。例如,在 NumPy 中 (3 & 4) 给出 0,而在 MATLAB 中 (3 & 4) 返回 1,因为 3 和 4 都被视为逻辑真。
MATLAB 的 & 运算符的优先级低于小于 (<) 和大于 (>) 等逻辑运算符;NumPy 的优先级相反。
如果您确定参数是布尔值,请使用 NumPy 的按位运算符,但在使用括号时要小心,如下例所示 -
z = (x > 1) & (x 2)
Python 设计的一个不良副作用是 NumPy 中缺少逻辑与、逻辑或运算符形式。
重塑和线性索引
MATLAB 允许通过使用线性或标量索引来访问多维数组,而 NumPy 则不允许。
在 MATLAB 程序中,线性索引经常被使用。
在转换 MATLAB 代码时,可能需要先将矩阵重塑为线性序列,执行一些基于索引的操作,然后再次重塑它。
鉴于重塑(通常)会创建对同一存储区的视图,因此应该能够相当快地完成此操作。需要注意的是,MATLAB 在使用 reshape 函数时使用 Fortran 顺序,而 NumPy 默认为 C 顺序。如果您只是从一个线性序列更改为另一个线性序列,则这无关紧要。
数据绘图
最后,当我们想要可视化数据时,绘图非常重要。Python 的 *Matplotlib* 函数提供了一套丰富的函数来执行绘图操作。
import numpy as np import matplotlib.pyplot as pltlib mat = np.matrix([[1,1,1],[2,4,6],[5,7,6]]) pltlib.plot(mat[:,1]) pltlib.plot(mat[:,0]) pltlib.title('MATLAB Plot') pltlib.xlabel('X-Axis') pltlib.ylabel('Y-Axis') pltlib.show()
个性化环境
在 MATLAB 中,个性化工作区的主要选项是更改搜索路径以包含自己喜欢的函数的位置。此类修改可以包含在一个启动脚本中,MATLAB 在启动时将执行该脚本。
Python 中的工具与 NumPy 中的工具相同。
定义“PYTHONPATH”环境变量以更改 Python 搜索路径,以便包含模块的位置。
在启动交互式 Python 解释器时,通过将“PYTHONSTARTUP”环境变量设置为该文件的文件名来指定要运行的特定脚本文件。
与 MATLAB 形成对比的是,在 MATLAB 中,路径上的任何内容都可以根据需要被调用,而在 Python 中,必须首先执行“导入”行并在可访问的特定文件中创建函数。
结论
在本教程中,我们学习了 MATLAB 用户如何切换到 Python,并讨论了各种 MATLAB-Python 等价物。