Python操作多维数组输出和矩阵运算示例


Posted in Python onNovember 28, 2019

本文实例讲述了Python操作多维数组输出和矩阵运算。分享给大家供大家参考,具体如下:

在许多编程语言中(Java,COBOL,BASIC),多维数组或者矩阵是(限定各维度的大小)预先定义好的。而在Python中,其实现更简单一些。

如果需要处理更加复杂的情形,可能需要使用Python的数学模块包NumPy,链接地址:http://numpy.sourceforge.net/

首先来看一个简单的二维表格。投掷两枚骰子时,有36种可能的结果。我们可以将其制成一个二维表格,行和列分别代表一枚骰子的得数:

 1 2 3 4 5 6
1 2 3 4 5 6 7
2 3 4 5 6 7 8
3 4 5 6 7 8 9
4 5 6 7 8 9 10
5 6 7 8 9 10 11
6 7 8 9 10 11 12

在Python中,一个像这样的多维表格可以通过“序列的序列”实现。一个表格是行的序列。每一行又是独立单元格的序列。这类似于我们使用的数学记号,在数学里我们用Ai,j,而在Python里我们使用A[i][j],代表矩阵的第i行第j列。

这看起来非常像“元组的列表”(Lists of Tuples)。

“列表的列表”示例

我们可以使用嵌套的列表推导式(list comprehension)创建一个表格。 下面的例子创建了一个“序列的序列”构成的表格,并为表格的每一个单元格赋值。

table= [[0 for i in range(6)] for j in range(6)]
print(table)
for d1 in range(6):
  for d2 in range(6):
    table[d1][d2]= d1+d2+2
print(table)

程序的输出结果如下:

[[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
[[2, 3, 4, 5, 6, 7], [3, 4, 5, 6, 7, 8], [4, 5, 6, 7, 8, 9],
[5, 6, 7, 8, 9, 10], [6, 7, 8, 9, 10, 11], [7, 8, 9, 10, 11, 12]]

这个程序做了两件事:创建了一个6 × 6的全0表格。 然后使用两枚骰子的可能组合的数值填充表格。 这并非完成此功能最有效的方式,但我们通过这个简单的例子来演示几项技术。我们仔细看一下程序的前后两部分。

程序的第一部分创建并输出了一个包含6个元素的列表,我们称之为“表格”;表格中的每一个元素都是一个包含6个0元素的列表。它使用列表推导式,对于范围从0到6的每一个j都创建对象。每一个对象都是一个0元素列表,由i变量从0到6遍历产生。初始化完成之后,打印输出二维全0表格。

推导式可以从里向外阅读,就像一个普通表达式一样。内层列表[ 0 for i in range(6) ]创建了一个包含6个0的简单列表。外层列表[ [...] for j in range(6) ]创建了这些内层列表的6个深拷贝。

程序的第2个部分对2个骰子的每一个组合进行迭代,填充表格的每一个单元格。这由两层嵌套循环实现,每一个循环迭代一个骰子。外层循环枚举第一个骰子的所有可能值d1。内层循环枚举第二个骰子d2。

更新每一个单元格时需要通过table[d1]选择每一行;这是一个包含6个值的列表。这个列表中选定的单元格通过...[d2]进行选择。我们将掷骰子的值赋给这个单元格,d1+d2+2

其他示例

打印出的列表的列表不太容易阅读。下面的循环会以一种更加可读的形式显示表格。

>>> 
for row in table:
... 
  print row
... 
[2, 3, 4, 5, 6, 7]
[3, 4, 5, 6, 7, 8]
[4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9, 10]
[6, 7, 8, 9, 10, 11]
[7, 8, 9, 10, 11, 12]

作为练习,读者可以试着在打印列表内容时,再打印出行和列的表头。提示一下,使用"%2d" % value字符串运算符可以打印出固定长度的数字格式。

显示索引值(Explicit Index Values)

我们接下来对骰子表格进行汇总统计,得出累计频率表。我们使用一个包含13个元素的列表(下标从0到12)表示每一个骰子值的出现频率。观察可知骰子值2在矩阵中只出现了一次,因此我们期望fq[2]的值为1。遍历矩阵中的每一个单元格,得出累计频率表。

fq= 13 * [0]
for i in range(6):
  for j in range(6):
    c= table[i][j]
    fq[ c ] += 1

使用下标i选出表格中的行,用下标j从行中选出一列,得到单元格c。然后用fq统计频率。

这看起来非常的数学和规范。Python提供了另外一种更简单一些的方式。

使用列表迭代器而非下标

表格是列表的列表,可以采用无下标的for循环遍历列表元素。

fq= 13 * [0]
print fq
for row in table:
  for c in row:
    fq[c] += 1
print fq[2:]

数学矩阵

我们使用了“显示下标”技术操作数学定义的矩阵。矩阵操作可以通过这种方式比较清晰地完成。我们在此演示矩阵加法的实现。

m1 = [[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0]]
m2 = [[2, 4, 6, 0], [1, 3, 5, 0], [0, -1, -2, 0]]
m3 = [4*[0] for i in range(3)]
for i in range(3):
  for j in range(4):
    m3[i][j] = m1[i][j] + m2[i][j]
print(m3)

运行结果:

[[3, 6, 9, 0], [5, 8, 11, 0], [7, 7, 7, 0]]

此例中,我们创建了两个输入矩阵m1和m2,每一个都是3×4矩阵。然后使用列表推导式初始化第三个3行4列的0矩阵m3。然后我们使用i变量遍历每一行,使用j变量遍历每一列,从而计算出m1和m2的和。

相关博文:Python Multi-Dimensional Arrays or Matrices Chapter 20. Advanced Sequences

本文链接:http://bookshadow.com/weblog/2015/01/08/python-multi-dimensional-arrays-matrices/

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

Python 相关文章推荐
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
Jul 24 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
使用python PIL库实现简单验证码的去噪方法步骤
May 10 Python
numpy数组之存取文件的实现示例
May 24 Python
python交易记录链的实现过程详解
Jul 03 Python
Python 共享变量加锁、释放详解
Aug 28 Python
Python语法垃圾回收机制原理解析
Mar 25 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
Nov 22 Python
关于的python五子棋的算法
May 02 Python
Python创建一个元素都为0的列表实例
Nov 28 #Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 #Python
Django框架反向解析操作详解
Nov 28 #Python
Django框架中间件定义与使用方法案例分析
Nov 28 #Python
Python Numpy 自然数填充数组的实现
Nov 28 #Python
Python创建数字列表的示例
Nov 28 #Python
flask框架json数据的拿取和返回操作示例
Nov 28 #Python
You might like
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
php 全局变量范围分析
2009/08/07 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
JavaScript实现存储HTML字符串示例
2014/04/21 Javascript
javascript设置连续两次点击按钮时间间隔的方法
2014/10/28 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
2015/12/29 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
tensorflow更改变量的值实例
2018/07/30 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
Python for循环与range函数的使用详解
2019/03/23 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
工程现场管理求职自荐信
2013/10/02 职场文书
小学生家长评语大全
2014/02/10 职场文书
计划生育标语
2014/06/23 职场文书
活动总结模板大全
2015/05/11 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
银行服务理念口号
2015/12/25 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python