对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() ,它与其他numpy函数一样,接受一个元组作为形状,是”numpythonic”的方法。
对于理解简单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为基准的索引。
任何数组/序列的第一个元素的索引为0,因为Python使用以0为基准的索引。
范围
在Python中,像0:5这样的构造只能用作切片索引;而在MATLAB中,0:5既可以用作”切片”索引(在方括号内),也可以用作范围字面量(在括号内)。
因此,为了使NumPy能够有一个类似简洁的范围创建方法,开发了 r_ object这个异常对象。
由于对象是使用方括号进行索引而不是像函数或函数Object() {[native code]}进行调用,因此可以在参数中使用切片语法。
逻辑运算
在MATLAB中,|和&分别是逻辑或和逻辑与,而在NumPy中,&或|是按位与和按位或。
有相当编程知识的人应该能够区分其差异。
尽管这两个运算符似乎具有相同的功能,但存在着重大的差异。
Numpy和MATLAB中&和|运算符之间的一些关键区别如下:
- 形式为0,1的非逻辑输入:Numpy的输出=输入的按位与。
-
MATLAB返回逻辑与,并将除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代码时,可能需要首先将矩阵重塑为线性序列,执行一些基于索引的操作,然后再次重塑它。
由于重塑(通常)创建对同一存储的视图,这应该能够相当快地完成。值得注意的是,当使用reshape函数时,MatLAB使用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相反,在Python中,必须首先执行一个“import”语句,并在一个特定的文件中定义可以访问的函数。
结论
在本教程中,我们学习了MATLAB用户如何切换到Python,并讨论了各种MATLAB-Python等效功能。