在 Python 中,我们可以将矩阵实现为嵌套列表(列表中的列表)。
我们可以将每个元素视为矩阵的一行。
例如 X = [[1, 2], [4, 5], [3, 6]]
将表示一个 3x2
的矩阵。
第一行可以选择为 X[0]
。并且,第一行第一列的元素可以选择为 X[0][0]
。
两个矩阵 X 和 Y 的乘法仅在 X 的列数等于 Y 的行数时才有定义。
如果 X 是一个 n x m
矩阵,Y 是一个 m x l
矩阵,那么 XY 是有定义的,并且维度为 n x l
(但 YX 是没有定义的)。这里有几种在 Python 中实现矩阵乘法的方法。
源代码:使用嵌套循环进行矩阵乘法
# Program to multiply two matrices using nested loops
# 3x3 matrix
X = [[12,7,3],
[4 ,5,6],
[7 ,8,9]]
# 3x4 matrix
Y = [[5,8,1,2],
[6,7,3,0],
[4,5,9,1]]
# result is 3x4
result = [[0,0,0,0],
[0,0,0,0],
[0,0,0,0]]
# iterate through rows of X
for i in range(len(X)):
# iterate through columns of Y
for j in range(len(Y[0])):
# iterate through rows of Y
for k in range(len(Y)):
result[i][j] += X[i][k] * Y[k][j]
for r in result:
print(r)
输出
[114, 160, 60, 27] [74, 97, 73, 14] [119, 157, 112, 23]
在这个程序中,我们使用了嵌套的 for
循环来遍历每一行和每一列。我们在结果中累加乘积的和。
这种技术很简单,但随着矩阵阶数的增加,计算成本会很高。
对于更大的矩阵运算,我们推荐使用优化的软件包,如 NumPy,它比上面的代码快上几倍(大约 1000 倍)。
源代码:使用嵌套列表推导式进行矩阵乘法
# Program to multiply two matrices using list comprehension
# 3x3 matrix
X = [[12,7,3],
[4 ,5,6],
[7 ,8,9]]
# 3x4 matrix
Y = [[5,8,1,2],
[6,7,3,0],
[4,5,9,1]]
# result is 3x4
result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]
for r in result:
print(r)
这个程序的输出与上面相同。要理解上面的代码,我们必须首先了解内置函数 zip()
和使用 * 运算符进行解包参数列表。
我们使用嵌套列表推导式来遍历矩阵中的每个元素。起初,代码看起来复杂且难以阅读。但一旦你掌握了列表推导式,你可能就不会再回到嵌套循环了。
要了解更多信息,请访问 Python 列表推导式。
另请阅读