Python实现矩阵转置的方法分析


Posted in Python onNovember 24, 2017

本文实例讲述了Python实现矩阵转置的方法。分享给大家供大家参考,具体如下:

前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加。例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再添加[5, 6]扩充为[[1, 3, 5], [2, 4, 6]]等等。

其实不动脑筋的话,用个二重循环很容易写出来:

def trans(m):
  a = [[] for i in m[0]]
  for i in m:
    for j in range(len(i)):
      a[j].append(i[j])
  return a
m = [[1, 2], [3, 4], [5, 6]]  # 想象第一个列表是原始的,后面的是往里添加的
print trans(m)  # result:[[1, 3, 5], [ 2, 4, 6]]

然而不管怎么看这种代码都很丑。

仔细看了一下m这种结构。等等,这不是字典的iteritems()的结果么?如果dict(m),那么结果——不就是keys()和values()么?

于是利用字典转换一下:

def trans(m):
  d = dict(m)
  return [d.keys(), d.values()]

可是再仔细想想,这里面有bug。如果添加列表的第一个元素相同,也就是转化之后dict的key相同,那肯定就不行了呀!况且,如果原始列表不是两个,而是多个,肯定不能用字典的呀!于是这种方法作罢,还是好好看看列表的形状。

然后又是一个不小心的发现:

Python实现矩阵转置的方法分析

这种转置矩阵的即时感是怎么回事?

没错,这个问题的本质就是求解转置矩阵。于是就简单了,还是用个不动脑筋的办法:

def trans(m):
  for i in range(len(m)):
    for j in range(i):
      m[i][j], m[j][i] = m[j][i], m[i][j]
  return m
m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print trans(m)

其实还是有点bug的,看起来是好用的,然而这个矩阵要求行列长度相同才行。

最后,群里某大神说:如果只是转置矩阵的话,直接zip就好了。这才想起来zip的本质就是这样的,取出列表中的对应位置的元素,组成新列表,正是这个题目要做的。

所以最终,这个题目(转置矩阵)的python解法就相当奇妙了:

def trans(m):
  return zip(*d)

没错,就这么简单。python的魅力。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python 常用string函数详解
May 30 Python
python实现淘宝秒杀脚本
Jun 23 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
pyqt 多窗口之间的相互调用方法
Jun 19 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
详解如何用python实现一个简单下载器的服务端和客户端
Oct 28 Python
浅谈Django前端后端值传递问题
Jul 15 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
Python request post上传文件常见要点
Nov 20 Python
python入门之算法学习
Apr 22 Python
利用python进行数据加载
Jun 20 Python
python入门学习关于for else的特殊特性讲解
Nov 20 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 #Python
利用python3随机生成中文字符的实现方法
Nov 24 #Python
Python内置函数 next的具体使用方法
Nov 24 #Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 #Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 #Python
Python内置函数——__import__ 的使用方法
Nov 24 #Python
Django中login_required装饰器的深入介绍
Nov 24 #Python
You might like
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
jquery中的 $("#jb51")与document.getElementById("jb51") 的区别
2011/07/26 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
JS关键字变色实现思路及代码
2013/02/21 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
基本DOM节点操作
2017/01/17 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
2018/12/12 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
python返回昨天日期的方法
2015/05/13 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
pytorch 模型可视化的例子
2019/08/17 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
机械制造与自动化应届生求职信
2013/11/16 职场文书
电子商务专业个人的自我评价
2013/11/19 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
小学中秋节活动方案
2014/02/06 职场文书
股指期货心得体会
2014/09/13 职场文书
会计求职简历自我评价
2015/03/10 职场文书
党员转正介绍人意见
2015/06/03 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android