比如
A向量:
[
A
1
,
A
2
]
[A_1, A_2]
[A1,A2]
B向量:
[
B
1
,
B
2
,
B
3
]
[B_1,B_2,B_3]
[B1,B2,B3]
要得到A向量中的每一个元素与B向量中的每一个元素相减的结果,如何计算?
A.shape = [2]
B.shape = [3]
用代码的话就是
#(1)A扩张到[2,3]
#(2)B扩张到[2,3]
#(3)A-B
A[:,None].expand[2,3]
B[None].expand[2,3]
A-B
现在来分析一下为什么要这么做?
(1)直接推一下想要的结果
(
A
1
−
B
1
A
1
−
B
2
A
1
−
B
3
A
2
−
B
1
A
2
−
B
2
A
2
−
B
3
)
\begin{pmatrix} A_1-B_1 & A_1-B_2 &A_1-B_3 \\ A_2-B_1& A_2-B_2& A_2-B_3 \end{pmatrix}
(A1−B1A2−B1A1−B2A2−B2A1−B3A2−B3)
明显可以拆成2个矩阵
A
=
(
A
1
A
1
A
1
A
2
A
2
A
2
)
A=\begin{pmatrix} A_1& A_1&A_1 \\ A_2& A_2& A_2 \end{pmatrix}
A=(A1A2A1A2A1A2)
B
=
(
B
1
B
2
B
3
B
1
B
2
B
3
)
B=\begin{pmatrix} B_1 & B_2 &B_3 \\ B_1& B_2& B_3 \end{pmatrix}
B=(B1B1B2B2B3B3)
A
−
B
即
得
到
最
终
的
结
果
A-B即得到最终的结果
A−B即得到最终的结果
(2)看一下这两个矩阵是怎么得到的?
A:A向量作为列向量,扩展3次
B:B向量作为行向量,扩展2次
(3)代码实现
A向量作为列向量,即[2]变为[2,1]
A[:,None]
B向量作为行向量,即[3]变为[1,3]
B[None,:]
或者省略后面的:
直接写成B[None]
A的列向量扩展到[2,3]
A[:,None].expand(2,3)
B的行向量扩展到[2,3]
B[None].expand(2,3)
相减即可
总结
要计算得到两个向量的每个元素分别加/减/乘/除后的矩阵
(1)一个向量作为列向量,另一个向量作为行向量
哪个向量作为列向量,看最后的结果希望第一个轴的值是多少,谁作为列向量谁决定第一个轴
(2)列向量扩展到最终矩阵的大小
(3)行向量扩展到最终矩阵的大小
(4)矩阵相加/减/乘/除,注意这里乘除是element-wise的乘/除