原文: https://www.programiz.com/python-programming/examples/multiply-matrix

在此示例中,我们将学习使用两种不同的方法来乘法矩阵:嵌套循环和嵌套列表推导式

要理解此示例,您应该了解以下 Python 编程主题:


在 Python 中,我们可以将矩阵实现为嵌套列表(列表内的列表)。

我们可以将每个元素视为矩阵的一行。

例如,X = [[1, 2], [4, 5], [3, 6]]将代表3x2矩阵。

第一行可以选择为X[0]。 并且,可以将第一行第一列中的元素选择为X[0][0]

仅当X中的列数等于Y行数时,才定义两个矩阵XY的相乘。

如果Xn x m矩阵,而Ym x l矩阵,则定义XY并具有尺寸n x l(但YX未定义)。 以下是在 Python 中实现矩阵乘法的两种方法。

源代码:使用嵌套循环的矩阵乘法

  1. # Program to multiply two matrices using nested loops
  2. # 3x3 matrix
  3. X = [[12,7,3],
  4. [4 ,5,6],
  5. [7 ,8,9]]
  6. # 3x4 matrix
  7. Y = [[5,8,1,2],
  8. [6,7,3,0],
  9. [4,5,9,1]]
  10. # result is 3x4
  11. result = [[0,0,0,0],
  12. [0,0,0,0],
  13. [0,0,0,0]]
  14. # iterate through rows of X
  15. for i in range(len(X)):
  16. # iterate through columns of Y
  17. for j in range(len(Y[0])):
  18. # iterate through rows of Y
  19. for k in range(len(Y)):
  20. result[i][j] += X[i][k] * Y[k][j]
  21. for r in result:
  22. print(r)

输出

  1. [114, 160, 60, 27]
  2. [74, 97, 73, 14]
  3. [119, 157, 112, 23]

在此程序中,我们使用了嵌套的for循环来遍历每一行和每一列。 我们累加结果中的乘积之和。

这种技术很简单,但是随着我们增加矩阵的阶数,计算量很大。

对于较大的矩阵操作,我们建议使用优化的软件包,例如 NumPy ,它比上述代码快几倍(大约 1000 倍)。

源代码:使用嵌套列表推导式的矩阵乘法

  1. # Program to multiply two matrices using list comprehension
  2. # 3x3 matrix
  3. X = [[12,7,3],
  4. [4 ,5,6],
  5. [7 ,8,9]]
  6. # 3x4 matrix
  7. Y = [[5,8,1,2],
  8. [6,7,3,0],
  9. [4,5,9,1]]
  10. # result is 3x4
  11. result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]
  12. for r in result:
  13. print(r)

该程序的输出与上述相同。 要理解以上代码,我们必须首先了解使用*运算符的内置函数zip()解包参数列表的方法。

我们使用嵌套列表推导式来遍历矩阵中的每个元素。 该代码起初看起来很复杂且不可读。 但是一旦掌握了列表推导式的技巧,您可能就不会回到嵌套循环了。