python实现矩阵转置zip_Python zip快速转置二维矩阵

  • Post author:
  • Post category:python


以前写MMA,发现转置非常好用,特别是处理表格数据,可以很方便的行列互换然后直接一个map丢上去。

虽然也可以写Map[f,list,{2}]这种样子但是可读性比较糟糕,所以还是会选择转置之后处理。

后来也用py写一些东西,发现py不像mma有那么多官方函数,网上查到的基本都是用第三方库或者干脆是暴力写,非常不美:

def transpose(M):

# 初始化转置后的矩阵

result = []

# 获取转置前的行和列

row, col = shape(M)

# 先对列进行循环

for i in range(col):

# 外层循环的容器

item = []

# 在列循环的内部进行行的循环

for index in range(row):

item.append(M[index][i])

result.append(item)

return result

(别问我为啥缩进是两格我不知道 网上随便拉的)

还有的解决方案是直接用第三方库:

import numpy as np

np.transpose(List).tolist()

然后我也一直非常快乐的这么用下去了。后来发现不对:为啥有的时候输出结果没转成呢?

一开始非常费解,一开始的代码写的明明有问题,后来怎么老是变得啥都没干?还一点报错都没有。

后来发现问题,表头和后面长度不一样,会长出来一截,导致不是矩阵,没法转置。最后写成这样:

ret = np.transpose([ret_head[:len(ret_body[0])]] + ret_body).tolist()

非常的丑陋,后来了解了解包相关知识,又听说py3.9要改zip来增加参数可以遍历到底,才意识到我的需求可以很容易的用zip处理:自动按顺序取出传入的各个元素

忽略多余的元素

漂亮

返回迭代器

代码:

ret = zip(ret_head, *ret_body)

以前一直是把zip当成类似MapThread之类的东西,不常用,在了解解包知识之前也完全想不到要怎么处理整个二维表,后来知道了之后又完全没考虑到这一茬,这几天才意识到可以用。

本以为我都能想到的东西世界上这么多聪明人应该是烂大街的,但是找了一下好像没找到太多相关的信息,所以写了这篇专栏,希望能分享给更多的人。

缺点:对于高维矩阵不太合适,理论上可以用但是似乎条件比较苛刻,可能有其他开销,代码可读性下降,只建议对二维表使用。

注:

返回值是tuple,所以要修改的话建议用

[list(_)for _ in zip(*L)]