numpy乘积运算
本文通过例子,对matrix/array格式的乘积运算进行总结。
1.关于乘积的三种操作
- *
- @
- np.dot()
- np.multiply()
2.一维matrix/array
m,n=np.array([1,2]),np.array([2,3])
a,b=np.mat([1,2]),np.mat([2,3])
2.1 使用*
m*n
Out: array([2, 6])
a*b
Out: ValueError: shapes (1,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)
a*b.T
Out: matrix([[8]])
在matrix格式,*出现了维度不匹配的问题,这是因为二者与我们通常理解的矩阵乘法是一致的。因此需要使用转置来解决。np.dot()也有类似情况,不再细述。
2.2 使用@
m @ n
#Out: 8 # type:numpy.int32
a @ b
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 1 is different from 2)
a @ b.T
Out: matrix([[8]])
在matrix格式,@出现了维度不匹配的问题,这是因为二者与我们通常理解的矩阵乘法是一致的。因此需要使用转置来解决。*运算也有类似情况,不再细述。
2.3 使用np.dot()
np.dot(m,n)
Out: 8
np.dot(a,b.T)
Out: matrix([[8]])
2.4 使用np.multiply()
np.multiply(m,n)
Out: array([2, 6])
np.multiply(a,b)
Out: matrix([[2, 6]])
3.多维matrix/array
以二维为例:
m,n=np.array([[1,2],[2,3]]),np.array([[1,0],[2,1]])
a,b=np.mat([[1,2],[2,3]]),np.mat([[1,0],[2,1]])
3.1 使用*
m*n
#Out:
array([[1, 0],
[4, 3]])
a*b
#Out:
matrix([[5, 2],
[8, 3]])
3.2 使用@
m @ n
#Out:
array([[5, 2],
[8, 3]])
a @ b
#Out:
matrix([[5, 2],
[8, 3]])
3.3 使用np.dot()
np.dot(m,n)
#Out:
array([[5, 2],
[8, 3]])
np.dot(a,b)
#Out:
matrix([[5, 2],
[8, 3]])
3.4 使用np.multiply()
np.multiply(m,n)
#Out:
array([[1, 0],
[4, 3]])
np.multiply(a,b)
#Out:
matrix([[1, 0],
[4, 3]])
可见对于多维数组,np.dot()和np.multiply()运算结果在数值上是相同的。
总结如下:
类型/运算 | * | @ | np.dot() | np.multiply() |
---|---|---|---|---|
一维np.array | 对应位置元素相乘 | 内积形式 | 内积形式 | 对应位置元素相乘 |
一维np.mat | 通常理解的矩阵乘法 | 通常理解的矩阵乘法 | 通常理解的矩阵乘法 | 对应位置元素相乘 |
多维np.array | 对应位置元素相乘 | 通常理解的矩阵乘法 | 通常理解的矩阵乘法 | 对应位置元素相乘 |
多维np.mat | 通常理解的矩阵乘法 | 通常理解的矩阵乘法 | 通常理解的矩阵乘法 | 对应位置元素相乘 |
可见 np.dot()
与@算子是等价的。
参考文献
[1] numpy.dot