关于numpy.outer/dot/multiply的原理记录
numpy.outer
numpy.outer(a,b,out=None)
计算两个向量的 外积。
假设有两个两个向量
a
=
[
a
0
,
a
1
,
a
2
]
a=[a_0,a_1 ,a_2]
a=[a0,a1,a2] 和
b
=
[
b
0
,
b
1
,
b
2
]
b=[b_0,b_1, b_2]
b=[b0,b1,b2] 那么他们的外积就是:
[
a
0
∗
b
0
a
0
∗
b
1
a
0
∗
b
2
a
1
∗
b
0
.
.
.
.
.
.
a
2
∗
b
0
.
a
2
∗
b
2
]
\left[ \begin{matrix} a_0*b_0 & a_0*b_1 & a_0*b_2\\ a_1*b_0 & . & & \\ ... & .& . & \\ a_2*b_0 & . & a_2*b_2 \end{matrix} \right]
⎣⎢⎢⎡a0∗b0a1∗b0...a2∗b0a0∗b1...a0∗b2.a2∗b2⎦⎥⎥⎤
对于两个矩阵
a
=
[
a
11
a
12
a
21
a
22
]
a=\begin{bmatrix} a_{11}&a_{12}\\ a_{21}&a_{22} \end{bmatrix}
a=[a11a21a12a22]和
b
=
[
b
11
b
12
b
21
b
22
]
b=\begin{bmatrix} b_{11}&b_{12}\\ b_{21}&b_{22} \end{bmatrix}
b=[b11b21b12b22] ,他们的外积等于
[
a
11
∗
b
11
a
11
∗
b
12
a
11
∗
b
21
a
11
∗
b
22
a
12
∗
b
11
a
12
∗
b
12
a
12
∗
b
21
a
12
∗
b
22
.
.
.
a
22
∗
b
11
a
22
∗
b
12
a
22
∗
b
21
a
22
∗
b
22
]
\left[ \begin{matrix} a_{11}*b_{11} & a_{11}*b_{12} & a_{11}*b_{21}&a_{11}*b_{22}\\ a_{12}*b_{11} & a_{12}*b_{12} & a_{12}*b_{21}&a_{12}*b_{22}\\ ...\\ a_{22}*b_{11} & a_{22}*b_{12} & a_{22}*b_{21}&a_{22}*b_{22} \end{matrix} \right]
⎣⎢⎢⎡a11∗b11a12∗b11...a22∗b11a11∗b12a12∗b12a22∗b12a11∗b21a12∗b21a22∗b21a11∗b22a12∗b22a22∗b22⎦⎥⎥⎤
参数
a:( M , M, M,)array_like
第一个输入的向量。如果是矩阵,自动展开成一维
b:( N , N, N,)array_like
第二个输入向量。如果是矩阵,自动展开成一维
out: ( M , N ) (M,N) (M,N)ndarray,optional
存储结果的地方,也就是说它就是 返回值
import numpy as np
a=[[1,2,3],[0,3,4],[3,0,5]]
a=np.array(a)
print(np.outer(a,a.T))
'''
[[ 1 0 3 2 3 0 3 4 5]
[ 2 0 6 4 6 0 6 8 10]
[ 3 0 9 6 9 0 9 12 15]
[ 0 0 0 0 0 0 0 0 0]
[ 3 0 9 6 9 0 9 12 15]
[ 4 0 12 8 12 0 12 16 20]
[ 3 0 9 6 9 0 9 12 15]
[ 0 0 0 0 0 0 0 0 0]
[ 5 0 15 10 15 0 15 20 25]]
'''
numpy.dot
numpy.dot(a, b, out=None)
同样是上面两个向量和两个矩阵
a
v
e
c
t
o
r
⋅
b
v
e
c
t
o
r
=
a
0
∗
b
0
+
a
1
∗
b
1
+
a
2
∗
b
2
a_{vector}\cdot b_{vector}=a_0*b_0+a_1*b_1+a_2*b_2
avector⋅bvector=a0∗b0+a1∗b1+a2∗b2
a m a t r i x ⋅ b m a t r i x = [ a 11 ∗ b 11 + a 12 ∗ b 21 a 11 ∗ b 12 + a 12 ∗ b 22 a 21 ∗ b 11 + a 22 ∗ b 21 a 21 ∗ b 12 + a 22 ∗ b 22 ] a_{matrix}\cdot b_{matrix}=\left[\begin{matrix}a_{11}*b_{11}+a_{12}*b_{21} & a_{11}*b_{12}+a_{12}*b_{22}\\ a_{21}*b_{11}+a_{22}*b_{21} & a_{21}*b_{12}+a_{22}*b_{22}\end{matrix}\right] amatrix⋅bmatrix=[a11∗b11+a12∗b21a21∗b11+a22∗b21a11∗b12+a12∗b22a21∗b12+a22∗b22]
至于参数,和上面的意思差不多
import numpy as np
a=[[1,2,3],[0,3,4],[3,0,5]]
a=np.array(a)
print(np.dot(a.T,a))
'''
[[10 2 18]
[ 2 13 18]
[18 18 50]]
'''
numpy.multiply
numpy.multiply(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'multiply'>¶
这个虽然参数很多,但是我们常使用不用这么多参数,只需要把两个向量(或者矩阵)输入进去就好了
至于原理,就和我们普通乘法一样,对应位置的元素相乘比如上面的两个矩阵
a
m
a
t
r
i
x
×
b
m
a
t
r
i
x
=
[
a
11
∗
b
11
a
12
∗
b
12
a
21
∗
b
21
a
22
∗
b
22
]
a_{matrix}\times b_{matrix=} \left[ \begin{matrix} a_{11}*b_{11}&a_{12}*b_{12}\\ a_{21}*b_{21}&a_{22}*b_{22} \end{matrix} \right]
amatrix×bmatrix=[a11∗b11a21∗b21a12∗b12a22∗b22]
import numpy as np
a=[[1,2,3],[0,3,4],[3,0,5]]
a=np.array(a)
print(np.multiply(a.T,a))
'''
[[ 1 0 9]
[ 0 9 0]
[ 9 0 25]]
'''