python三维矩阵乘法_Python操作多维数组输出和矩阵运算⽰
例
本⽂实例讲述了Python操作多维数组输出和矩阵运算。分享给⼤家供⼤家参考,具体如下:
在许多编程语⾔中(Java,COBOL,BASIC),多维数组或者矩阵是(限定各维度的⼤⼩)预先定义好的。⽽在Python中,其实现更简单⼀些。
如果需要处理更加复杂的情形,可能需要使⽤Python的数学模块包NumPy,链接地址:numpy.sourceforge/
⾸先来看⼀个简单的⼆维表格。投掷两枚骰⼦时,有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)
python 定义数组我们接下来对骰⼦表格进⾏汇总统计,得出累计频率表。我们使⽤⼀个包含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程序设计有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论