matlab 程序改写为 python 程序的方法
介绍了如何将 matlab 代码转换为 python 程序的方法,以及需要注意的技术细节。
matlab 程序改写为 python 程序的方法
为自己的产品代个言
为了解决 Matlab 代码转 Python 代码的工作,我们开发了 MaToPy,一套可以自动将 Matlab 代码转为 Python 代码的编译器和运行时函数库。
可以快速将 Matlab 代码自动转译为 Python 代码,得到的 Python 代码和 Matlab 代码极为相似,非常便于维护,且转换准确率很高,几乎不用人工修改就可以顺利运行。
想试用的朋友请移步这里:http://matopy.telecwin.com。
概述
将 matlab 代码改写为 python 代码是有技巧的,如果掌握,其实还是比较容易将一个 matlab 程序改写为 python 程序的。
因为 python 有很多优秀的数据处理函数库,最常用的就是 numpy 和 pandas 了。之所以能很方便地将 matlab 改写为 python 程序,就是因为这二者的存在。但是 matlab 的语法、约定和 python、numpy 以及 pandas 等在一些细节上是有区别的,如果不熟悉这些细微差异,那么改写完的代码很容易引入 bug,甚至无法正常运行。
下面我们先来看看大体上,将 matlab 程序转为 python 程序怎么做,然后再深入了解M和P程序的细微差异。
阅读本文前,最好有已经了解 numpy 和 pandas 的基本概念和用法。
pandas 的作用
pandas 主要承担下列matlab任务:
- 读写数据文件,一般是 excel 文件。例如:读取输入参数文件;将计算结果输出到 excel 文件。
- 按列名访问列数据、行数据。即使用 DataFrame 的行索引、列索引功能。
Matlab 和 Python 的差异
索引操作符号:M(1),P[0]
matlab 中访问矩阵中的元素,用圆括号做为索引操作符,像这样 A(1)
,而python中用方括号,像这样A[1]
。
下标起始值:M从1开始,P从0开始
matlab 行列下标都是从1开始;而 python,numpy,pandas 中下标都是从0开始,无论是 array 还是 list。
这个差异不但影响程直接访问元素的语句,还会影响包含循环语句的代码逻辑。
比如下面这段matlab 代码,转换成 python 代码时就需要注意下标差异。
L=length(A)
for i=1:L-1
B = A(i)
C = A(i+1)
end
转为 python 代码:
L = len(A)
for i in range(0, L):
B = A[i]
从上面的代码可以看到,如果要遍历一个数组 A,那么可以将 A 的长度 L=len(A)
作为range 的结束位置,而不会造成下标越界,因为 range(start, end) 总是不包含结束位置。
python 中 range(n) 从0开始,不包括结束点
python 中 range(start, end, step) 函数和 python 的“冒号操作符”是一样的规则,都不包括末尾下标,例如:
for i in range(0, 3):
pass
这段代码只会循环三次,i 取 0, 1, 2 这三个数,而不包括 3 。
冒号操作符:M(1:10),P[0:10]
matlab 中冒号操作符可以用来描述一个范围,且包含末尾下标。而 python 中冒号操作符虽然也是描述一个范围,但不包含末尾下标。这个区别非常容易导致转写的python代码出现bug,需要小心检查。
例如:
% 下面的 matlab 代码A将有10个数
A = M(1:10)
# 和上面的 matlab 对应的 python 代码应该这样写:
A = M[0:10]
Matlab 中变量赋值会创建新的矩阵而 python 中只是创建一个引用
如果 numpy 中需要显式地copy一个矩阵,可以像这样:
d = a.copy() # a new array object with new data is created
del d # 删除变量,释放内存
Matlab 中删除元素的操作
在 Matlab 中可以用赋值空数组的方式删除满足条件的元素,例如:
% 删除第一行和第二行,可以这样写:
A(1:2, :) = []
numpy 中的删除函数
而用 numpy 和 pandas 删除一行要这样写:
import numpy as np
a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
a_del = np.delete(a, 1, 0)
print(a_del)
# [[ 0 1 2 3]
# [ 8 9 10 11]]
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
其函数形式是 np.delete(ndarray对象, 行列索引, axis),其中 axis = 0 表示删除行,1表示删除列。
注意 np.delete 函数不会修改原 ndarray 对象,而是返回一个新对象。
而 matlab 则是直接修改原对象。
pandas 中的删除函数
pandas 中删除行列要用 drop() 函数。
df = pd.DataFrame(np.arange(12).reshape(3, 4),
columns=['A', 'B', 'C', 'D'])
# df 内容:
df
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
df.drop(['B', 'C'], axis=1)
df.drop(columns=['B', 'C'])
# 返回的结果:
A D
0 0 3
1 4 7
2 8 11
注意:pandas drop() 也是返回修改后的对象,原对象没有被改变。但 drop() 可以用inplace=True 参数进行就地修改,这时返回的反而是修改前的数据,修改后的数据在原对象中。
python 的幂运算符是 ** 而 matlab 是 ^
matlab代码:
a = 10 ^ -3
python 代码:
a = 10 ** -3
# 更好的方式是使用科学计数格式:
a = 1E-3
转载说明
文章为原创,欢迎转载,只要注明出处、作者(微风好飞行)即可。
------------------------ 2021年12月23日 于北京通州 ------------------------
更多推荐
所有评论(0)