Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 由于其语言的简洁、易读以“胶水般”的可扩展性,越来越多的童鞋选择使用Python进行科学计算。 Numpy是Python下的一个数值计算库,提供了多维数组,线性代数、傅里叶变换等众多数值计算函数。 如果使用Python+Numpy+Scipy(提供众多科学计算函数,基于Numpy)+matplotlib(一个强大的绘图库,绘图效果秒杀matlab!),那么你几乎可以做在matlab下能做的任何事情。 网上有很多比较matlab与numpy的文章,他们的各自优缺点请自行谷歌。 在此提供一个matlab与numpy函数的对照表,从表中我们可以看出,numpy中的大多数函数的名称及使用方法与matlab中很相似,但是这并不意味这把程序从matlab移植到numpy中很容易, 其中的主要困难有:1、数组的引用方式(这是之后的重点)不同; 2、numpy中矩阵乘与数组乘的区别;3、数组的拼接方式不同,这些不同之处使得程序移植与把程序重新写一遍差不多。 matlab下有许多商业的工具箱,这些东西压根就没法移植。而如果你之前使用matlab积累了一些程序,那么把这些好不容易写成的程序都移植过去也不现实。 所以,保持两边各自的“画风”不变,仅仅交换数据,是matlab与numpy联合工作的最佳选择。 科学数据其实就是一大堆的数,其他的数据结构大都是用来辅助科学计算的,所以我们只需要实现两边多维数组数据的交换就可以了,交换其他的数据结构既费劲有没有太大的意义,好了,现在切入正题。
numpy与matlab 的数组引用差别
首先我们来做一件事情,看看使用两种语言中同样功能的函数达到的不同效果:
创建一个一维数组1~120,120=2×3×4×5,然后reshape为2×3×4×5的多维数组
matlab中:
a = 1:120;
b = reshape(a, [2,3,4,5]);
b
b(:,:,1,1) =
1 3 5
2 4 6
b(:,:,2,1) =
7 9 11
8 10 12
.......
b(:,:,4,5) =
115 117 119
116 118 120
首先说明一下各个索引值的意义
b是一个(2,3,4,5)的四维数组,它可以这么理解
[每一列有2个元素,每一矩阵有3列,每一页有4个矩阵,一共有5页]
(其中行,列大家都懂,页就像是几个矩阵叠起来)
科学计算的时候,一定要搞清楚自己数据的数据结构:每一行,每一列都是什么物理或数学意义,一般我们习惯以列或者矩阵为一个具有物理或数学意义的单位实体。那么我这个4维数据可以这么理解。
我有一个四维数组,它存了4×5个矩阵,每一个矩阵的大小为2×3,我想引用第n页第m个矩阵,就使用b(:,:,m,n)
可以看出,让matlab自己输出这个矩阵,它就是按照这种理解输出的,或者
我所存的数据是二维坐标点,共存了3×4×5个,我可以使用b(:,m,n,k)的形式引用某一个坐标
matlab中比元素高一级的数组的单位是“列向量”,matlab储存数据是“按列”储存的。
我们拿到一个矩阵,通常使用“第几行第几列”来引用它的一个数据元素,matlab可不是这么理解的。
matlab认为:“第几行”=“第几个列向量”, “第几列”=“列向量中的第几个元素”
所以我们来看看reshape函数对a做了些神马:
reshape为(2,3,4,5),matlab先把数据分成5页,每章有24个数据,再把一页的数据分为4个矩阵