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回调函数的使用方法
Jan 23 Python
在Django框架中伪造捕捉到的URLconf值的方法
Jul 18 Python
python去除空格和换行符的实现方法(推荐)
Jan 04 Python
Python守护线程用法实例
Jun 23 Python
python实现感知器算法详解
Dec 19 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
对python判断ip是否可达的实例详解
Jan 31 Python
Python字节单位转换实例
Dec 05 Python
PyQt5实现画布小程序
May 30 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 Python
Python爬虫回测股票的实例讲解
Jan 22 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
让你的PHP同时支持GIF、png、JPEG
2006/10/09 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
php封装实现钉钉机器人报警接口的示例代码
2020/08/08 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
web页面数据展示新想法(json)
2010/06/08 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
基于insertBefore制作简单的循环插空效果
2015/09/21 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
JS操作JSON常用方法(10w阅读)
2020/12/06 Javascript
python client使用http post 到server端的代码
2013/02/10 Python
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
PHP基于phpqrcode类库生成二维码过程解析
2020/05/28 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
你对IPv6了解程度
2016/02/09 面试题
物业管理毕业生个人的求职信
2013/11/30 职场文书
大专毕业自我鉴定
2014/02/04 职场文书
行政助理的岗位职责
2014/02/18 职场文书
股权收购意向书
2014/04/01 职场文书
学生犯错保证书
2015/05/09 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
合同范本之电脑出租
2019/08/13 职场文书