Numpy 中 * 用法
-
在numpy.array数组类型中(不能为list),是将两个数组中元素一一对应相乘,即点乘。
-
在numpy.mat矩阵类型中,是叉乘,即矩阵相乘。
a = np.array([[3, 3, 3],[4, 4, 4]])
b = np.array([[5],[5]])
c = np.array([[5,5]])
d = np.mat([[3, 3, 3],[4, 4, 4]])
print(a*b)
print(c*d)
结果:
[[15 15 15]
[20 20 20]]
[[35 35 35]]
numpy.dot()
当dot()作用在数组类型或list类型时,两个一维数组时,结果为内积;其他为矩阵乘(即矢量积,叉乘)。
官方文档
我翻译一下
- 如果a,b是两个实数,就是普通相乘。
- 如果a,b两个都是一维数组,结果就是向量的内积。
- 如果a,b都是二维数组,就变成矩阵相乘运算,推荐使用
matmul
和@
代替。 - …等等
a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.array([[3,3,3],[4,4,4]])
d = np.array([[5],[5],[5]])
print(np.dot(a,b))
print(np.dot(c,d))
结果:
6
[[35 35 35]]
当dot()作用在矩阵类型时(无论矩阵规模),两个矩阵要满足矩阵乘的行列要求,结果为矩阵乘(即矢量积,叉乘)
e = np.mat([[3,3,3],[4,4,4]])
f = np.mat([[5],[5],[5]])
print(np.dot(e,f))
结果:
matrix([[45],
[60]])
numpy.multiply()
无论传入的参数类型是数组、矩阵、list,结果都为它们的数量积,点乘(即矩阵对应元素相乘)。 注意:当维数不同时,具有有广播现象。
a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.array([[3,3,3],[4,4,4]])
print(np.multiply(a,b))
print(np.multiply(b,c))
结果:
array([2, 2, 2])
array([[6, 6, 6],
[8, 8, 8]])
numpy.matmul
numpy.matmul
本质上是返回两个矩阵的矩阵乘积。
即如果两个都是二维数组,或矩阵,结果就是直接的矩阵积。
import numpy.matlib
import numpy as np
a = [[1,0],[0,1]]
b = [[4,1],[2,2]]
print (np.matmul(a,b))
[[4 1]
[2 2]]
果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈(即把最后两维当成单个矩阵,前面当成它的索引),并进行相应广播。
import numpy.matlib
import numpy as np
a = np.arange(8).reshape(2,2,2)
b = np.arange(4).reshape(2,2)
print (np.matmul(a,b))
[[[ 2 3]
[ 6 11]]
[[10 19]
[14 27]]]
关于这里广播操作,举个例子, 如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。
import numpy.matlib
import numpy as np
a = [[1,0],[0,1]]
b = [1,2]
print (np.matmul(a,b))
print (np.matmul(b,a))
[1 2]
[1 2]