跳到主要内容

Python 程序:两个矩阵相乘

要理解这个示例,你需要了解以下Python编程主题的知识:

在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中实现矩阵乘法的几种方法。

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

# 程序:使用嵌套循环进行两个矩阵乘法
# 3x3矩阵
X = [[12, 7, 3],
[4, 5, 6],
[7, 8, 9]]
# 3x4矩阵
Y = [[5, 8, 1, 2],
[6, 7, 3, 0],
[4, 5, 9, 1]]
# 结果是3x4
result = [[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]

# 遍历X的行
for i in range(len(X)):
# 遍历Y的列
for j in range(len(Y[0])):
# 遍历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这样的优化软件包,它比上述代码快几千(数量级)倍。

源代码:使用列表推导进行矩阵乘法

# 程序:使用列表推导进行两个矩阵乘法
# 3x3矩阵
X = [[12, 7, 3],
[4, 5, 6],
[7, 8, 9]]

# 3x4矩阵
Y = [[5, 8, 1, 2],
[6, 7, 3, 0],
[4, 5, 9, 1]]

# 结果是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() 和 使用 * 运算符进行 解包参数列表

我们使用了嵌套列表推导来遍历矩阵中的每个元素。这段代码乍看起来复杂且难以阅读。但一旦你掌握了列表推导,你可能就不会再回到嵌套循环了。