Numpy中np.dot与np.matmul的区别详解
ACTerminate 人气:0作用相同的情况
在若两个array的维度均为两维的情况下,两个函数的结果是相同的,例如:
a = np.array([i for i in range(6)]).reshape([2,3]) b = np.array([i for i in range(6)]).reshape([3,2]) """ a [[0 1 2] [3 4 5]] b [[0 1] [2 3] [4 5]] """
>>> np.dot(a,b) array([[10, 13], [28, 40]]) >>> np.matmul(a,b) array([[10, 13], [28, 40]])
作用不同的情况
在三维的情况下,假设
a = np.array([i for i in range(12)]).reshape([2,2,3]) b = np.array([i for i in range(12)]).reshape([2,3,2]) """ a [[[ 0 1 2] [ 3 4 5]] [[ 6 7 8] [ 9 10 11]]] b [[[ 0 1] [ 2 3] [ 4 5]] [[ 6 7] [ 8 9] [10 11]]] """
>>> np.matmul(a,b) array([[[ 10, 13], [ 28, 40]], [[172, 193], [244, 274]]]) >>> np.matmul(a,b).shape (2, 2, 2)
这是因为matmul将最后两维作为矩阵的两维,相当于有2个2 ∗ 2 2*22∗2的矩阵,因此通过对应位置矩阵进行矩阵乘法,会得到2个2 ∗ 2 2*22∗2的结果
>>> np.dot(a,b) array([[[[ 10, 13], [ 28, 31]], [[ 28, 40], [100, 112]]], [[[ 46, 67], [172, 193]], [[ 64, 94], [244, 274]]]]) >>> np.dot(a,b).shape (2, 2, 2, 2)
可以看到其结果与matmul不同并且结果是四维的,这是因为dot将a数组的最后一维作为向量,并将b数组的倒数第二维作为了另一个向量,因此a中可以看成有2 ∗ 2 2*22∗2个向量,b中有2 ∗ 2 2*22∗2个向量,dot会将a的向量与b的向量全部组合在一起,因此会有( 2 ∗ 2 ) ∗ ( 2 ∗ 2 ) (2*2)*(2*2)(2∗2)∗(2∗2)种结果。
加载全部内容