前言
深度学习的矩阵相乘引发的Bug,由此深刻学习这方面的相关知识
在Python中,特别是使用NumPy库时,元素相乘和矩阵相乘是处理数组和矩阵时的常见操作
1. 元素相乘
元素相乘是指对两个相同形状
的数组中的对应元素逐个相乘
multiply()
函数可以实现这一操作,运算符*
也可以用于元素相乘
import numpy as np
# 定义两个数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 元素相乘
result = np.multiply(a, b)
print("元素相乘的结果(使用multiply()):", result)
截图如下:
import numpy as np
# 定义两个数组
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9], [10, 11, 12]])
# 元素相乘
result = a * b
print("元素相乘的结果(使用*运算符):\n", result)
截图如下:
2. 矩阵相乘
矩阵相乘遵循线性代数中的矩阵乘法规则,即结果矩阵的第(i, j)个元素是第一个矩阵的第i行与第二个矩阵的第j列对应元素的乘积之和
使用dot()
函数、matmul()
函数以及@
运算符来进行矩阵相乘
dot():
import numpy as np
# 定义两个矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵相乘
result = np.dot(A, B)
print("矩阵相乘的结果(使用dot()):\n", result)
matmul():
import numpy as np
# 定义两个矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵相乘
result = np.matmul(A, B)
print("矩阵相乘的结果(使用matmul()):\n", result)
@:
import numpy as np
# 定义两个矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵相乘
result = A @ B
print("矩阵相乘的结果(使用@运算符):\n", result)
这三者截图都如下:
3. 差异
功能 | 函数/运算符 | 描述 |
---|---|---|
元素相乘 | multiply() | NumPy中的元素级乘法函数,接受任意数量的数组参数,并将它们的对应元素逐个相乘 |
*运算符 | 也用于元素级乘法,其行为与multiply()函数相同 | |
矩阵相乘 | dot() | 用于计算两个数组的点积(内积)。如果传入的参数是一维数组,则计算的是它们的标量积。如果传入的是二维数组(矩阵),则计算的是矩阵乘法 |
matmul() | 用于执行矩阵乘法。不支持一维数组的点积,而是将它们视为行或列向量进行矩阵相乘 | |
@运算符 | Python 3.5及更高版本引入的矩阵乘法运算符。用于执行矩阵乘法 |