matlab 程序改写为 python 程序的方法

matlab 程序改写为 python 程序的方法

  • 概述
  • pandas 的作用
  • Matlab 和 Python 的差异
  • 索引操作符号:M(1),P[0]
  • 下标起始值:M从1开始,P从0开始
  • python 中 range(n) 从0开始,不包括结束点
  • 冒号操作符:M(1:10),P[0:10]
  • Matlab 中变量赋值会创建新的矩阵而 python 中只是创建一个引用
  • Matlab 中删除元素的操作
  • numpy 中的删除函数
  • pandas 中的删除函数
  • python 的幂运算符是 ** 而 matlab 是 ^
  • 转载说明
  • 概述

    将 matlab 代码改写为 python 代码是有技巧的,如果掌握,其实还是比较容易将一个 matlab 程序改写为 python 程序的。
    因为 python 有很多优秀的数据处理函数库,最常用的就是 numpy 和 pandas 了。之所以能很方便地将 matlab 改写为 python 程序,就是因为这二者的存在。但是 matlab 的语法、约定和 python、numpy 以及 pandas 等在一些细节上是有区别的,如果不熟悉这些细微差异,那么改写完的代码很容易引入 bug,甚至无法正常运行。

    下面我们先来看看大体上,将 matlab 程序转为 python 程序怎么做,然后再深入了解M和P程序的细微差异。

    阅读本文前,最好有已经了解 numpy 和 pandas 的基本概念和用法。

  • Pandas 数据结构 – DataFrame
  • NumPy Ndarray 对象
  • 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 则是直接修改原对象。

    详情参考 numpy 的delete函数文档。

    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 参数进行就地修改,这时返回的反而是修改前的数据,修改后的数据在原对象中。

    详情参考pandas drop函数。

    python 的幂运算符是 ** 而 matlab 是 ^

    matlab代码:

    a = 10 ^ -3
    

    python 代码:

    a = 10 ** -3
    
    # 更好的方式是使用科学计数格式:
    a = 1E-3
    

    转载说明

    文章为原创,欢迎转载,只要注明出处、作者(微风好飞行)即可。

    ———————— 2021年12月23日 于北京通州 ————————

    物联沃分享整理
    物联沃-IOTWORD物联网 » matlab 程序改写为 python 程序的方法

    发表评论