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的等价物
Submatrix
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既可以作为“切片“索引(在方括号内),也可以作为范围(在括号内)。
因此,古怪的r_对象被开发出来,以便Numpy可以有一个类似的简洁的范围创建方法。
因为r_对象是用方括号来索引的,而不是像函数或函数Object() { [native code] }那样被调用,所以参数中可以使用切片语法。
Logicops
在MATLAB中,|和&是逻辑上的AND/OR,而在NumPy中,&或|是位法AND/OR。
任何具有大量编程知识的人都应该能够区分其中的差别。
虽然两者看起来功能相同,但还是有很大的区别。
以下是Numpy和MATLAB中的&和|操作符的一些关键区别 −
- 0,1形式的非逻辑输入:Numpy的输出=输入的比特和。
-
例如,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使用的是Fortran顺序,而NumPy在使用reshape函数时默认的是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等价物。