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实现排序算法
Feb 14 Python
Python 创建子进程模块subprocess详解
Apr 08 Python
python操作ssh实现服务器日志下载的方法
Jun 03 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
python flask中静态文件的管理方法
Mar 20 Python
python控制nao机器人身体动作实例详解
Apr 29 Python
三步实现Django Paginator分页的方法
Jun 11 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
Jun 26 Python
Python requests设置代理的方法步骤
Feb 23 Python
python实现电子词典
Mar 03 Python
Python 虚拟环境工作原理解析
Dec 24 Python
用pip给python安装matplotlib库的详细教程
Feb 24 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框架Laravel学习心得体会
2015/10/28 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
AngularJS 教程及实例代码
2017/10/23 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
Python多线程实例教程
2014/09/06 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
python批量从es取数据的方法(文档数超过10000)
2018/12/27 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
python3.6编写的单元测试示例
2019/08/17 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
外语系毕业生自荐信范文
2013/12/16 职场文书
采购部部长岗位职责
2014/02/06 职场文书
师范生自荐信模板
2014/05/28 职场文书
颐和园的导游词
2015/01/30 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
小学教师教学反思
2016/02/24 职场文书