矩阵乘法是线性代数中的基本运算。
我们通常在许多应用程序中使用它,例如图像处理、机器学习等等。 NumPy 是一个著名的用于科学计算的 Python 包。
然而,在这篇文章中,我们将研究在不使用 NumPy 的情况下在 Python 中进行矩阵乘法的各种方法。
我们将利用 嵌套循环、内置的 map() 函数和列表理解。
此外,我们还将研究每种策略的优点和缺点,以及何时应用它们。 如果您是线性代数的新手,想了解更多关于矩阵乘法的知识; 继续阅读。
我们在哪里使用矩阵乘法?
矩阵乘法用于 电脑图像 改变 2D 和 3D 视觉效果。 例如,您可以旋转、缩放和平移屏幕上的对象。 矩阵在图像处理中用于将图片表示为像素阵列。 此外,矩阵可用于进行图像过滤等操作。
我们还利用矩阵 机器学习. 它们可以帮助我们表示数据和模型参数。 我们可以执行许多操作,例如计算点积和矩阵向量积。
当然,这种操作在科学操作上也是非常有利的。 我们可以在物理和工程中使用它来描述物理量。 因此,我们可以使用向量和张量进行操作。
为什么我们可能不选择使用 NumPy?
虽然 NumPy 是一个 Python 库,它并不总是矩阵乘法的理想选择。 由于大小和依赖性、学习和遗留系统等原因,我们可能不会选择使用 NumPy。
在某些情况下,使用 Python 的内置函数或开发自定义代码可能更有效。 然而,重要的是要注意 NumPy 是一个强大的库。 此外,您还可以将其用于矩阵乘法。
现在,让我们看看如何在没有 NumPy 的情况下实现矩阵乘法。
嵌套循环法
嵌套循环技术使用嵌套循环在 Python 中执行矩阵乘法。 该函数遍历每个矩阵元素。 并且,它使用一系列嵌套循环将它们相乘。 该函数返回存储在新矩阵中的结果。
这种方法很容易掌握。 但是,它可能不如其他方式有效,尤其是对于较大的矩阵。 然而,如果您不熟悉线性代数,这对您来说是一个不错的选择。
def matrix_multiplication(A, B):
# Determine the matrices' dimensions.
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# 将结果矩阵设置为零。
result = [[0 for row in range(cols_B)] for col in
range(rows_A)]
# Iterate through rows of A
for s in range(rows_A):
# Iterate through columns of B
for j in range(cols_B):
# Iterate through rows of B
for k in range(cols_A):
result[s][j] += A[s][k] * B[k][j]
return result
让我们举一个例子来说明如何做到这一点。 您可以在下面添加这些代码行来测试这个例子。
# Sample matrices
A = [[1, 4, 3], [4, 9, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Perform matrix multiplication
result = matrix_multiplication(A, B)
# Print the result
print(result)
# Output: [[76, 84], [175, 194]]
好处
- 易于理解。
- 非常适合新手或那些寻求更深入理解矩阵乘法的人。
缺点:
- 不如替代技术有效,特别是对于更大的矩阵。
- 它不如其他方法可读。
map()函数方法
map() 函数方法提供了一种在 Python 中进行矩阵乘法的替代方法。 在这种方法中,我们使用内置的 map() 函数。 因此,我们使用函数式编程工具,将提供的函数应用于每个可迭代元素(列表、元组等)。 此外, map() 函数接受两个参数,一个函数和一个可迭代对象。 并且,它返回一个将函数应用于每个可迭代元素的迭代器。
在这种方法中,我们遍历矩阵的每个成员并使用嵌套的 map() 函数进行乘法运算。
zip() 函数用于并行遍历矩阵的每个元素。
最后,使用 sum() 函数将结果相加。
def matrix_multiplication(A, B):
# To get the dimensions of the matrices
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# We use map() function for multiplication.
result = [[sum(a * b for a, b in zip(row_a, col_b)) for
col_b in zip(*B)] for row_a in A]
return result
现在,我们可以再次用一个例子来测试我们的代码。
# Example matrices
A = [[3, 2, 3], [4, 5, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Use map() function to perform matrix multiplication
result = list(map(lambda x: list(map(lambda y: sum(i*j
for i,j in zip(x,y)), zip(*B))), A))
# Print the result
print(result)
# Output: [[72, 80], [139, 154]]
优势
- 比堆叠循环方法更有效
- 它使用函数式编程来简化代码。
缺点
- 一些不熟悉函数式编程的人可能会觉得它的可读性较差。
- 它比嵌套循环技术更难理解。
列表推导法
列表理解使您能够在一行代码中生成一个新列表。 因此,这是通过将表达式应用于现有列表的每个成员来实现的。
在这种方法中,乘法是通过重复遍历每个矩阵成员来执行的。 我们正在使用分层列表理解。
# Sample matrices
A = [[1, 12, 3], [14, 5, 6]]
B = [[7, 8], [9, 10], [12, 12]]
# Matrix multiplication using list comprehension
result = [[sum(A[i][k] * B[k][j] for k in range(len(A[0])))
for j in range(len(B[0]))] for i in range(len(A))]
# Print the result
print(result)
[[151, 164], [215, 234]]
认证的益处
- 与 map() 函数方法相比,更短且更具可读性。
缺点
- 它可能不如使用 map() 函数有效,尤其是对于大型矩阵。
- 它比嵌套循环方法更难。
结论
在这篇文章中,我们研究了在 Python 中乘矩阵时使用 NumPy 的替代方法。 我们在嵌套循环、内置 map() 函数和列表理解中执行了矩阵乘法。
最佳策略将取决于项目的特定需求。
每种策略都有其自身的优点和缺点。 为确保函数正常运行,最好添加一些具有各种矩阵维度和值的测试用例。
您还应该包括一些性能测试来比较这些方法的执行情况。
发表评论