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实现批量重命名文件的代码
May 25 Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
Python实现求一个集合所有子集的示例
May 04 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
python3.5基于TCP实现文件传输
Mar 20 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
Django框架安装方法图文详解
Nov 04 Python
Python 定义只读属性的实现方式
Mar 05 Python
python实现PDF中表格转化为Excel的方法
Jun 16 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用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
浅谈javascript中的 “ && ” 和 “ || ”
2017/02/02 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
python基础教程之元组操作使用详解
2014/03/25 Python
Python缩进和冒号详解
2016/06/01 Python
Django的Modelforms用法简介
2019/07/27 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
员工试用期考核自我鉴定
2014/04/13 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
毕业生个人总结
2015/02/28 职场文书