以最简洁的python代码实现常用矩阵运算

越来越喜欢python这种编程语言了。大学毕业后进入国内某著名互联网公司,发现大公司都使用PHP,想想PHP肯定有什么过人之处,于是也开始花时间学习PHP,发现PHP确实是一门入门极块的语言,因为各种函数都太像C语言了,本博客也一度终止开发,想用Yii框架(所谓最适合开发WEB2.0应用的高性能PHP框架)来重写一个,但慢慢地,越写越厌倦PHP了,尤其是非常鸡肋的class,到处充斥着难看的$this->,又因为没有中间字节码之类的东西,类也不会常驻内存,所以构造函数变得毫无意义,小版本升级都会带来不少麻烦,为了提速还得安装Accelerate之类的玩意,这玩意还常常core一下,像多人合作开发时,一不小心写了两个名字一样的类,这玩意就喜欢core,调试起来还麻烦。后来版本为了避免名字冲突问题,又加了更为鸡肋的特性,就是名字空间。总之是后来放弃了PHP,又回到了Python的怀抱。我是开发C/C++后台服务的,怕记忆混淆,也比较排斥Java。好吧,闲话就此打住。

本文是讲用Python实现矩阵的加法运算和乘法运算,写几层for循环,实现矩阵加法和乘法并不困难,但关键是要足够简洁,这个可让我费了不少脑子。先直接上代码吧。

#矩阵表示形式
M = [
   [a1, a2, a3],
   [a4, a5, a6],
   [a7, a8, a9]
]
#矩阵加法
def madd(M1, M2):
    if isinstance(M1, (tuple, list)) and isinstance(M2, (tuple, list)):
        return [[m+n for m,n in zip(i,j)] for i, j in zip(M1,M2)]
#矩阵乘法
def multi(M1, M2):
    if isinstance(M1, (float, int)) and isinstance(M2, (tuple, list)):
        return [[M1*i for i in j] for j in M2] 
    if isinstance(M1, (tuple, list)) and isinstance(M2, (tuple, list)):
        return [[sum(map(lambda x: x[0]*x[1], zip(i,j)))
                 for j in zip(*M2)] for i in M1] 

加法和乘法实现都只用了一行代码就搞定了,注意,均没有做严格的输入参数合法性检查。乘法处理了常数乘矩阵和矩阵乘矩阵两种情况。

上面的实现只是用了一些小技巧,熟悉python的人应该很快能弄懂。主要用到了zip函数,该函数的功能就是将若干个list的元素一一对应起来,map函数相当于是一层for循环,即将某list里的元素依次执行某函数,得到一个新的list。特别注意zip(*M2),就这么简单就能取到矩阵的每一列元素。对,就是这些,对着代码好好琢磨琢磨吧。

发表于 2013年08月09日 00:26   评论:0   阅读:3278  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo