6 Jul 2015

Python Tips - Easiest Transpose of a Matrix

收藏到CSDN网摘

涉及科学计算时,转置(Transpose)是一个非常常用的操作.Python中使用list comprehension可以非常简单的操作矩阵.例如下面的代码可将原始矩阵转置:
>>> m = [[i*3+j for j in range(3)] for i in range(3)]
>>> m
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
>>> n = [[m[i][j] for i in range(len(m))] for j in range(len(m[0]))]
>>> n
[[0, 3, 6], [1, 4, 7], [2, 5, 8]]
>>> 

上面的代码已经非常间断.然而在有些code golf中,极度追求代码长度的时候,list comprehension仍嫌臃肿.这时候可以使用一些高级函数,例如 map, zip, filter等.下面的代码使用zip函数和python中的列表引用功能来实现矩阵转置
>>> n2 = list(zip(*m))
>>> n2
[(0, 3, 6), (1, 4, 7), (2, 5, 8)]
>>> 

不过仔细比较后可以发现,原矩阵表示为list of lists,n2则表示为list of tuples.不过在python中list与tuple都使用方括号([])来访问数据,所以并不影响使用.但是如果非要返回的数据也是list of lists,应该怎么操作呢?答案就是使用map函数.示例如下:
>>> n3 = list(map(list,zip(*m)))
>>> n3
[[0, 3, 6], [1, 4, 7], [2, 5, 8]]
>>> 

python中还有其他高级函数例如reduce,lambda等,可参考这里.

==
更新:matlab中有很简单的矩阵旋转函数,下面是python版本的针对2D矩阵的旋转操作
# rot90 (clockwise)
cw = list(zip(*m[::-1]))
# rot90 (counter-clockwise)
ccw = list(zip(*m))[::-1]

==
更新:如果要对3D矩阵做旋转操作,例如按照列,行,第三维的顺序重新排列矩阵,则可以进行如下操作
a,b,c分别为原矩阵,原矩阵按照列进行重组,原矩阵按照第三维方向进行重组
b = [list(zip(*p))for p in a]
c = [list(zip(*p))for p in zip(*a)]

No comments :

Post a Comment