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多进程并发(multiprocessing)用法实例详解
Jun 02 Python
python select.select模块通信全过程解析
Sep 20 Python
python基础教程项目三之万能的XML
Apr 02 Python
Python 实现在文件中的每一行添加一个逗号
Apr 29 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
python区块及区块链的开发详解
Jul 03 Python
Django如何使用redis作为缓存
May 21 Python
Python用户自定义异常的实现
Dec 25 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 Python
python基于OpenCV模板匹配识别图片中的数字
Mar 31 Python
python 调用js的四种方式
Apr 11 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
php将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
详解Puppeteer 入门教程
2018/05/09 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
vue组件name的作用小结
2018/05/23 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
JS如何生成随机验证码
2020/03/02 Javascript
Python 时间处理datetime实例
2008/09/06 Python
pymssql ntext字段调用问题解决方法
2008/12/17 Python
python自动化测试之setUp与tearDown实例
2014/09/28 Python
由浅入深讲解python中的yield与generator
2017/04/05 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
python微信公众号开发简单流程
2018/03/23 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
python实现程序重启和系统重启方式
2020/04/16 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
工作自我评价分享
2013/12/01 职场文书
上级检查欢迎词
2014/01/18 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
小学新课改心得体会
2016/01/22 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL