同为脚本语言,matlab和python在算法优化过程中都不可避免的会涉及到,甚至有些情况下会涉及到两种语言程序的互相转换,这几天我刚好也做了相关工作,需要将之前用matlab写的一个小算法模块转换成python,以方便和模型集成,过程不难,但因为需要同时涉及两种语言的书写风格,并且这两种语音在某些方面还挺相似,难免会一时混淆,遂简单整理一下形成此篇博文,方便区分及后续查阅。
矩阵相关处理
矩阵维度及成员的差异
matlab中,多维矩阵的维度是固定的,如果维度不统一,定义的时候就会报错而python中,数组的成员不单单可以是数,也可以是列表等
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
a.shape # (3,4)
a.ndim # 2
>>> print(a) #二维数组
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
print(type(a))
<class 'numpy.ndarray'>
b = np.array([[1,2,3,4], [5,6,7,8], [9,10,11]])
b.shape # (3,)
b.ndim # 1
>>> print(b) #一维数组,数组成员是不同维度的列表
[list([1, 2, 3, 4]) list([5, 6, 7, 8]) list([9, 10, 11])]
>>> print(type(b))
<class 'numpy.ndarray'>
矩阵索引和切片
matlab和python中的矩阵索引和切片非常相似,但存在很多细微差异,这些细微差异经常会是导致数据对不上的原因。-
matlab默认取值从1开始计数,而python默认从0开始计数
即matlab中A(2),对应 python中A[1]; -
边界值是否取到的差异
matlab中A(2:5)是A(2)-A(5)四个数,而python中A[2:5]是A[2]--A[4]三个数,并且注意因为第一点差异的存在A(2不等于A[2]; -
matlab中使用(),而python中numpy使用[]
python中的()表示元组。 -
python中矩阵名是指针,需要特别注意矩阵的赋值
>>> a=np.array([1,2,3])
>>> b=a
>>> a
array([1, 2, 3])
>>> b
array([1, 2, 3])
>>> a[1]=10
>>> a
array([ 1, 10, 3])
>>> b
array([ 1, 10, 3])
而matlab中不涉及:
>> a=[1,2,3];
>> b=a;
>> a
a =
1 2 3
>> b
b =
1 2 3
>> a[2]=10;
>> a
a =
1 10 3
>> b
b =
1 2 3
一些常用矩阵操作
不管是matlab还是python,都可以对矩阵进行一些整体操作。 比如:- 对每个元素进行(+,-,*,/)
% matlab
A+1 %每个元素+1
A.^2 %每个元素平方
A[A<=0]=0 %将A中小于0的值赋为0
# python
A+1 #每个元素+1
A**2 #每个元素平方
np.where(A> 0, A, 0)
循环
循环是代码中常用的逻辑,matlab和python的简单差异是:matlab:
for i = [1:10]
process;
end
python:
for i in range(10):
process
一些常用函数
操作 | matlab | python |
---|---|---|
长度 | length | len |
取对数 | log10 | math.log10 |
滤波器 | filter | scipy.signal.lfilter |
直方图 | histogram | np.histogram |