8

Matlab无缝迁移到Python(一):数组

 3 years ago
source link: https://zhuanlan.zhihu.com/p/147692874
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Matlab无缝迁移到Python(一):数组

厦门量潮科技有限公司 执行董事

大家好,我来蹭热点了。

这个系列主要帮助Matlab初级玩家无缝迁移到Python,不讲解Python相关库的实现原理,主要是帮助解决部分同学短期内无法使用Matlab的问题。

这篇文章讲讲基础的数组结构如何迁移。文章手打,没有Matlab环境测试(太占地方并且用不着于是卸载),没有Python环境测试(我觉得我问题不太大),如果有bug概不负责(误)。(时间仓促,给方案要紧,有bug大家报我改。)


Matlab其实是Matrix Lab的缩写,就是矩阵实验室,所以这也很好理解为什么Matlab的基础数据结构是数组。

这里首先简单区分一下数组和矩阵,数组是N维,矩阵是2维,也就是说矩阵就是特殊的数组。不过在Matlab和Python中,同样的计算符号,矩阵计算规则和数组略微不一样,后面会简要介绍一下。

首先说Matlab,Matlab中一个矩阵结构大概是这样的:

a = [1 2 3; 4 5 6; 7 8 9]

行内用空格或者逗号,行之间用分号。

在Python中,数组的数据结构是用numpy库的ndarray来实现,可以这样创建:

import numpy as np

array = np.array([[1,2,3],[4,5,6],[7,8,9]])

结果同Matlab,可以大概看出对应关系,一个方括号内,在Python叫做列表(list),是一行。

常见的一些Matlab的命令都可以实现,比如说计算sin,Matlab的写法是

sin(a)

Python的实现是

np.sin(array)

常见的矩阵计算也很容易实现,比如Matlab

inv(a)

Python中需要调用linalg子库(linear algebra的缩写)

np.linalg.inv(array)

熟悉Matlab的同学可能对于调用库这种操作感到陌生和不方便。这个和Python面向对象的设计有关系,为了保证不同的库之间重名不打架。比如说阿里出了一个NumPy的魔改并行版本,接口和NumPy几乎一模一样,如果需要同时调用,就可以用这种调用方式来减少麻烦。不过谁会闲的没事干这个呢。

如果想要方便一些,可以在导入的时候这样

from numpy.linalg import inv

这样做几乎可以无缝迁移代码了,因为本来NumPy就是Matlab的高仿……

最后强调一下数组计算和矩阵计算的区别,以区别最大的乘法为例,矩阵的乘法是按照矩阵规则来的,而数组计算采用的机制在Python的NumPy叫做广播(forecasting),说起来比较复杂,表面上看就是数组是按照位置一对一计算的。

熟悉Matlab的同学对于数组计算和矩阵计算也有了解。Matlab默认是为矩阵设计的,所以默认的*是矩阵计算,而数组计算需要用.*Python的NumPy默认是数组,所以默认的*是数组计算,而矩阵乘法需要用点积(np.dot)来计算。这里来简单地做个示例,读者可以自己测试一下。

Matlab:

[1 2;3 4]*[3 4;5 6]

Python NumPy:

a = np.array([[1,2],[3,4]])
b = np.array([[3,4],[5,6]])
np.dot(a, b)

或者Python3.5以后支持:

a@b

Matlab:

[1 2;3 4].* [3 4;5 6]

Python NumPy:

a*b

还有一种方法是使用np.matrix代替np.array,这样*就是矩阵乘法,数组乘法详见文末附的文档。文档中也不推荐使用np.matrix,并且有给出原因。不过如果希望可以和Matlab体验一致,可以考虑。

剩下的大部分方法,比如length,max,等等,使用非常类似,采用面向百度的编程查命令即可,熟悉了自然就记下来了。另外,scipy这个库也是同样的使用方法,这个库和NumPy是一家出的,只不过是把计算模块单独拿出来。使用起来同刚刚的方案,比如说

from scipy.<子库名> import <函数名>

详细列表在这里:SciPy v1.4.1 Reference Guide

有一个比较暴力的无缝迁移技巧,是在Python文件头这样导入:

from numpy import *
from numpy.linalg import *
from scipy.<子库名> import *

这样就可不带模块名直接用函数了。(不过Python的规范是尽量避免这种导入方法,害怕出现未知冲突,这个新手随意啦,代码写出来要紧。)

好了,恭喜你已经掌握了从Matlab数组迁移到NumPy的方案。(没掌握作者概不负责)

最后放一个菜单,NumPy官方提供的和Matlab的对比文档,可以用作查阅:NumPy for Matlab users最后放一个菜单,NumPy官方提供的和Matlab的对比文档,可以用作查阅:

NumPy for Matlab users​numpy.org


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK