讨论numpy中的np.matmul,.dot以及*的区别,要区分一维情况和二维情况。
一维情况
import numpy as np
np_array = np.arange(3)
print(
'np_array:', np_array,
'\ndot:', np_array.dot(np_array),
'\n*:', np_array * np_array
)
输出结果为:
np_array: [0 1 2]
dot: 5
*: [0 1 4]
可以看出,.dot是对应元素相乘再相加,而*是指对应元素相乘,大小和之前的数组是一样的。
二维情况
import numpy as np
np_array = np.arange(4).reshape((2, 2)) # The form of array
np_matrix = np.mat(np_array)
print(
'\nnp_matrix:', np_matrix,
'\nmatrix_mul1:', np_matrix.dot(np_matrix),
'\nmatrix_mul2:', np.matmul(np_matrix, np_matrix),
'\nmatrix_mul3:', np_matrix * np_matrix, # matrix multiply
'\nnp_array:', np_array,
'\narray_mul1:', np_array.dot(np_array),
'\narray_mul2:', np.matmul(np_array, np_array),
'\narray_mul3:', np_array * np_array, # corresponding elements multiply
)
输出结果为:
np_matrix: [[0 1]
[2 3]]
matrix_mul1: [[ 2 3]
[ 6 11]]
matrix_mul2: [[ 2 3]
[ 6 11]]
matrix_mul3: [[ 2 3]
[ 6 11]]
np_array: [[0 1]
[2 3]]
array_mul1: [[ 2 3]
[ 6 11]]
array_mul2: [[ 2 3]
[ 6 11]]
array_mul3: [[0 1]
[4 9]]
对于矩阵的二维情况,可以看到matmul、* 以及.dot都是标准意义上的矩阵相乘运算。
而对于数组,只有 * 是对应元素相乘,其余都是矩阵运算。
小结
因此,要明确区分一维和二维情况,在二维情况下,要注意 * 运算,不能和其他运算交替使用。