1、对于矩阵(matrix)而言
multiply是对应元素相乘,而 * 、np.matmul() 函数 与 np.dot()函数 相当于矩阵乘法(矢量积),对应的列数和行数必须满足乘法规则;如果希望以数量积的方式进行,则必须使用 np.multiply 函数,如下所示:
1
2
3
4
|
a = np.mat([[ 1 , 2 , 3 , 4 , 5 ]]) b = np.mat([[ 1 , 2 , 3 , 4 , 5 ]]) c = np.multiply(a,b) print (c) |
结果是
[[ 1 4 9 16 25]]
a = np.mat([[1, 2, 3, 4, 5]])
b = np.mat([ [1],[2],[3],[4],[5] ] )
d=a*b
print(d) #a是shape(1,5),b是shape(5,1),结果是一个实数
结果是
[[55]]
2、对于数组(array)而言
* 与 multiply均表示的是数量积(即对应元素的乘积相加),np.matmul与np.dot表示的是矢量积(即矩阵乘法)。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
if __name__ = = '__main__' : w = np.array([[ 1 , 2 ],[ 3 , 4 ]]) x = np.array([[ 1 , 3 ],[ 2 , 4 ]]) w1 = np.array([[ 1 , 2 ],[ 3 , 4 ]]) x1 = np.array([[ 1 , 2 ]]) w_mat = np.mat([[ 1 , 2 ],[ 3 , 4 ]]) x_mat = np.mat([[ 1 , 3 ],[ 2 , 4 ]]) print ( "x1.shape:" ,np.shape(x1)) w_x_start = w * x w_x_dot = np.dot(w,x) x_w_dot = np.dot(x,w) w_x_matmul = np.matmul(w, x) x_w_matmul = np.matmul(x, w) w_x_multiply = np.multiply(w,x) x_w_multiply = np.multiply(x, w) #w1_x1_matmul = np.matmul(w1, x1) x1_w1_matmul = np.matmul(x1, w1) w_x_mat_matmul = np.matmul(w_mat,x_mat) x_w_mat_matmul = np.matmul(x_mat, w_mat) w_x_mat_start = w_mat * x_mat x_w_mat_start = x_mat * w_mat w_x_mat_dot = np.dot(w_mat,x_mat) x_w_mat_dot = np.dot(x_mat,w_mat) w_x_mat_multiply = np.multiply(w_mat,x_mat) x_w_mat_multiply = np.multiply(x_mat,w_mat) print ( "w.shape:" , np.shape(w)) print ( "x.shape:" , np.shape(x)) print ( "w_x_start.shape:" , np.shape(w_x_start)) print ( "w_x_dot.shape:" , np.shape(w_x_dot)) print ( "x_w_dot.shape:" , np.shape(x_w_dot)) print ( "x1_w1_matmul.shape::" , np.shape(x1_w1_matmul)) print ( "做array数组运算时:" , '\n' ) print ( "w_x_start:" , w_x_start) print ( "w_x_dot:" , w_x_dot) print ( "x_w_dot:" , x_w_dot) print ( "w_x_matmul:" , w_x_matmul) print ( "x_w_matmul:" , x_w_matmul) print ( "w_x_multiply:" , w_x_multiply) print ( "x_w_multiply:" , x_w_multiply) # print("w1_x1_matmul:", w1_x1_matmul) print ( "x1_w1_matmul:" , x1_w1_matmul) print ( "做matrix矩阵运算时:" , '\n' ) print ( "w_x_mat_start:" , w_x_mat_start) print ( "x_w_mat_start:" , x_w_mat_start) print ( "x_w_mat_dot:" , x_w_mat_dot) print ( "w_x_mat_dot:" , w_x_mat_dot) print ( "w_x_mat_matmul:" ,w_x_mat_matmul) print ( "x_w_mat_matmul:" , x_w_mat_matmul) print ( "w_x_mat_multiply" ,w_x_mat_multiply) print ( "x_w_mat_multiply" , x_w_mat_multiply) |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
x1.shape: ( 1 , 2 ) w.shape: ( 2 , 2 ) x.shape: ( 2 , 2 ) w_x_start.shape: ( 2 , 2 ) w_x_dot.shape: ( 2 , 2 ) x_w_dot.shape: ( 2 , 2 ) x1_w1_matmul.shape:: ( 1 , 2 ) 做array数组运算时: w_x_start: [[ 1 6 ] [ 6 16 ]] w_x_dot: [[ 5 11 ] [ 11 25 ]] x_w_dot: [[ 10 14 ] [ 14 20 ]] w_x_matmul: [[ 5 11 ] [ 11 25 ]] x_w_matmul: [[ 10 14 ] [ 14 20 ]] w_x_multiply: [[ 1 6 ] [ 6 16 ]] x_w_multiply: [[ 1 6 ] [ 6 16 ]] x1_w1_matmul: [[ 7 10 ]] 做matrix矩阵运算时: w_x_mat_start: [[ 5 11 ] [ 11 25 ]] x_w_mat_start: [[ 10 14 ] [ 14 20 ]] x_w_mat_dot: [[ 10 14 ] [ 14 20 ]] w_x_mat_dot: [[ 5 11 ] [ 11 25 ]] w_x_mat_matmul: [[ 5 11 ] [ 11 25 ]] x_w_mat_matmul: [[ 10 14 ] [ 14 20 ]] w_x_mat_multiply [[ 1 6 ] [ 6 16 ]] x_w_mat_multiply [[ 1 6 ] [ 6 16 ]] |
python中转置的优先级高于乘法运算 例如:
a = np.mat([[2, 3, 4]])
b = np.mat([[1,2,3]] )
d=a*b.t
print(d)
结果是
[[20]]
其中a为1行3列,b也为1行3列,按理来说直接计算a*b是不能运算,但是计算d=a*b.t是可以的,结果是20,说明运算顺序是先转置再计算a与b转置的积,*作为矩阵乘法,值得注意的在执行*运算的时候必须符合行列原则。
numpy中tile()函数的用法
b = tile(a,(m,n)):即是把a数组里面的元素复制n次放进一个数组c中,然后再把数组c复制m次放进一个数组b中,通俗地讲就是将a在行方向上复制m次,在列方向上复制n次。
python中的 sum 和 np.sum 是不一样的,如果只写sum的话,表示的是数组中对应的维度相加,如果写 np.sum 的话,表示一个数组中的维数和列数上的数都加在一起。
如下图所示:
补充:总结:numpy中三个乘法运算multiply,dot和* 的区别
引言:
本人在做机器学习的练习1的时候,时常抛出错误:
not aligned是什么意思呢?
意思是两个矩阵相乘无意义。
线性代数中mxn 和 nxp的矩阵才能相乘,其结果是mxp的矩阵。
出错源代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def gradientdescent(x,y,theta,alpha,iteration): colunms = int (theta.ravel().shape[ 1 ]) thetai = np.matrix(np.zeros(theta.shape)) cost = np.zeros(iteration) for i in range (iteration): error = x * theta.t - y for j in range (colunms): a = np. sum (error * x[:,j]) / len (x) ########## error! thetai[ 0 ,j] = thetai[ 0 ,j] - alpha * a theta = thetai cost[i] = computecost(x, y, theta) return theta,cost |
这里error是一个nx1的矩阵,theta.t也是一个nx1的矩阵。
而矩阵之间*运算符表示矩阵乘法。我们这里想实现矩阵的对应元素相乘,因此应该用np.multiply()实现。
总结:
(读者可使用简单的举例自行验证)
1.*用法:
矩阵与矩阵:矩阵乘法(matrix)
数组与数组:对应位置相乘(array)
2.np.dot()用法:
矩阵相乘的结果
3.np.multiply()用法:
数组、矩阵都得到对应位置相乘。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/xiaodongsuibi/p/8305921.html