本文主要说明numpy模块中两种乘法使用的符号@和*,并未对广播原则进行详细介绍。
1.以示例说明矩阵乘法与广播类逐元素相乘的区别
示例矩阵和列向量
m
=
[
1
2
3
4
5
6
7
8
9
]
,
v
=
[
10
20
30
]
m= \begin{bmatrix} 1\quad2\quad3 \\ 4\quad5\quad6 \\ 7\quad8\quad9 \\ \end{bmatrix}, v=\begin{bmatrix} 10 \\ 20 \\ 30 \end{bmatrix}
m=⎣⎡123456789⎦⎤,v=⎣⎡102030⎦⎤
【1】矩阵乘法
m
m
m与
v
v
v相乘为
[
1
∗
10
+
2
∗
20
+
3
∗
30
4
∗
10
+
5
∗
20
+
6
∗
30
7
∗
10
+
8
∗
20
+
9
∗
30
]
=
[
10
+
40
+
90
40
+
100
+
180
70
+
160
+
270
]
=
[
140
320
500
]
\begin{bmatrix} 1*10+2*20+3*30 \\ 4*10+5*20+6*30 \\ 7*10+8*20+9*30 \end{bmatrix} =\begin{bmatrix} 10+40+90 \\ 40+100+180 \\ 70+160+270 \end{bmatrix} =\begin{bmatrix} 140 \\ 320 \\ 500 \end{bmatrix}
⎣⎡1∗10+2∗20+3∗304∗10+5∗20+6∗307∗10+8∗20+9∗30⎦⎤=⎣⎡10+40+9040+100+18070+160+270⎦⎤=⎣⎡140320500⎦⎤
【2】广播类逐元素相乘
m
m
m与
v
v
v相乘为
[
1
∗
10
2
∗
10
3
∗
10
4
∗
20
5
∗
20
6
∗
20
7
∗
30
8
∗
30
9
∗
30
]
=
[
10
20
30
80
100
120
210
240
270
]
\begin{bmatrix} 1*10&2*10&3*10 \\ 4*20&5*20&6*20 \\ 7*30&8*30&9*30 \end{bmatrix}= \begin{bmatrix} 10&20&30 \\ 80&100&120\\ 210&240&270 \end{bmatrix}
⎣⎡1∗104∗207∗302∗105∗208∗303∗106∗209∗30⎦⎤=⎣⎡10802102010024030120270⎦⎤
2.numpy模块调用流程
In [1]: import numpy as np
In [2]: m = np.array([[1,2,3],[4,5,6],[7,8,9]])
In [3]: v = np.array([[10],[20],[30]])
# 【1】矩阵乘法
In [4]: m @ v
Out[4]: array([[140],
[320],
[500]])
# 【2】广播类逐元素相乘
In [5]: m * v
Out[5]: array([[ 10, 20, 30],
[ 80, 100, 120],
[210, 240, 270]])
【说明】
- numpy模块中矩阵乘法使用符合@
- 广播类逐元素相乘结果矩阵的shape与shape最大矩阵保持一致
先将 v v v扩展为 [ 10 10 10 20 20 20 30 30 30 ] \begin{bmatrix}10&10&10\\20&20&20\\30&30&30\end{bmatrix} ⎣⎡102030102030102030⎦⎤,shape与 m m m保持一致,然后再与 m m m进行逐元素的相乘。详细可参照numpy模块广播的原则。