一、总结
向量的内积,即点乘:
np.dot(a,b)
等价于a@b
向量的外积,即叉乘:np.cross(a,b)
向量元素对应位置相乘:np.multiply(a,b)
等价于a*b
矩阵点乘,即对应元素相乘:
np.multiply(a,b)等价于a*b
矩阵叉乘,即矩阵乘法规则运算:np.dot(a,b)
等价于a@b
二、向量
2.1 向量的内积
向量的点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。
对于向量
a
=
[
a
1
,
a
2
,
⋯
,
a
n
]
\bold a=[a_1, a_2, \cdots, a_n]
a=[a1,a2,⋯,an]和向量
b
=
[
b
1
,
b
2
,
⋯
,
b
n
]
\bold b=[b_1, b_2, \cdots, b_n]
b=[b1,b2,⋯,bn],
a
⋅
b
=
a
1
b
1
+
a
2
b
2
+
⋯
+
a
n
b
n
\bold a \cdot \bold b=a_1b_1+a_2b_2+ \cdots + a_nb_n
a⋅b=a1b1+a2b2+⋯+anbn这里要求一维向量a和向量b的行列数相同。
内积对应numpy中的函数为:np.dot(a,b)
和a@b
,且两种方式等价
In [34]: a = np.array([1, 2, 3])
In [35]: b = np.array([6, 7, 8])
In [36]: np.dot(a, b)
Out[36]: 44
2.2 向量的外积
两个向量的叉乘,又叫向量积、外积、叉积,其运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。
外积的几何意义:在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。
向量的外积,对应numpy中np.cross()
方法:
In [38]: a = np.array([1, 2, 3])
In [39]: b = np.array([6, 7, 8])
In [40]: np.cross(a, b)
Out[40]: array([-5, 10, -5])
2.3 向量哈德玛乘积
向量哈德玛乘积(Hadamard积),元素对应位置相乘所得到的新向量,用用 ⊙ \odot ⊙ 或者 ∘ \circ ∘表示:
对于向量 a = [ a 1 , a 2 , ⋯ , a n ] \bold a=[a_1, a_2, \cdots, a_n] a=[a1,a2,⋯,an]和向量 b = [ b 1 , b 2 , ⋯ , b n ] \bold b=[b_1, b_2, \cdots, b_n] b=[b1,b2,⋯,bn], a ⊙ b = a 1 b 1 + a 2 b 2 + ⋯ + a n b n \bold a \odot \bold b=a_1b_1+a_2b_2+ \cdots + a_nb_n a⊙b=a1b1+a2b2+⋯+anbn
向量哈德玛乘积,对应numpy中的np.multiply(a,b)
和a*b
:
In [42]: a = np.array([1, 2, 3])
In [43]: b = np.array([6, 7, 8])
In [44]: np.multiply(a, b)
Out[44]: array([ 6, 14, 24])
2.4 示例
三、矩阵
3.1 矩阵乘法(矩阵叉乘)
矩阵叉乘中, 前者的列数=后者的行数
[
w
11
w
12
w
21
w
22
w
31
w
32
]
3
×
2
×
[
x
11
x
12
x
21
x
22
]
2
×
2
=
[
w
11
x
11
+
w
12
x
21
w
11
x
12
+
w
12
x
22
w
21
x
11
+
w
22
x
21
w
21
x
12
+
w
22
x
22
w
31
x
11
+
w
32
x
21
w
31
x
12
+
w
32
x
22
]
\begin{bmatrix} w_{11} & w_{12} \\ w_{21} & w_{22} \\ w_{31} & w_{32} \\ \end{bmatrix}_{3\times 2} \times \begin{bmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \\ \end{bmatrix}_{2\times 2}=\begin{bmatrix} w_{11}x_{11} + w_{12} x_{21}& w_{11}x_{12} + w_{12}x_{22} \\ w_{21}x_{11} + w_{22} x_{21}& w_{21}x_{12} + w_{22}x_{22} \\ w_{31}x_{11} + w_{32} x_{21}& w_{31}x_{12} + w_{32}x_{22} \end{bmatrix}
w11w21w31w12w22w32
3×2×[x11x21x12x22]2×2=
w11x11+w12x21w21x11+w22x21w31x11+w32x21w11x12+w12x22w21x12+w22x22w31x12+w32x22
numpy中,对应方法是:np.dot(a,b)
等价于a@b
,需要注意的是这里要注意的是,np.dot(A, B)
和np.dot(B, A)
的值可能不一样。
In [12]: import numpy as np
In [13]: A = np.asarray([[1, 2], [3, 4], [5, 6]])
In [14]: A.shape
Out[14]: (3, 2)
In [15]: B = np.asarray([[1, 2, 3], [4, 5, 6]])
In [16]: B.shape
Out[16]: (2, 3)
In [17]: np.dot(A, B)
Out[17]:
array([[ 9, 12, 15],
[19, 26, 33],
[29, 40, 51]])
In [18]: np.dot(B, A)
Out[18]:
array([[22, 28],
[49, 64]])
3.2 矩阵点乘(矩阵哈达玛积)
矩阵点乘要求两矩阵为同型矩阵(即两个矩阵的行数与列数都相同),对应元素相乘。
[ w 11 w 12 w 13 w 21 w 22 w 23 ] 2 × 3 ⊙ [ x 11 x 12 x 13 x 21 x 22 x 23 ] 2 × 3 = [ w 11 x 11 w 12 x 12 w 13 x 13 w 21 x 21 w 22 x 22 w 23 x 23 w 31 x 31 w 32 x 32 w 33 x 33 ] \begin{bmatrix} w_{11} & w_{12} & w_{13}\\ w_{21} & w_{22} & w_{23}\\ \end{bmatrix}_{2\times 3} \odot \begin{bmatrix} x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23}\\ \end{bmatrix}_{2\times 3}=\begin{bmatrix} w_{11}x_{11} & w_{12}x_{12} & w_{13}x_{13} \\ w_{21}x_{21} & w_{22}x_{22} & w_{23}x_{23} \\ w_{31}x_{31} & w_{32}x_{32} & w_{33}x_{33} \\ \end{bmatrix} [w11w21w12w22w13w23]2×3⊙[x11x21x12x22x13x23]2×3= w11x11w21x21w31x31w12x12w22x22w32x32w13x13w23x23w33x33
numpy中,对应方法是:np.multiply(a,b)
,该方法等价于a*b
。
In [25]: A = np.asarray([[1, 2], [3, 4], [5, 6]])
In [26]: B = np.asarray([[1, 2], [3, 4], [5, 6]])
In [27]: A
Out[27]:
array([[1, 2],
[3, 4],
[5, 6]])
In [28]: B
Out[28]:
array([[1, 2],
[3, 4],
[5, 6]])
In [29]: np.multiply(A,B)
Out[29]:
array([[ 1, 4],
[ 9, 16],
[25, 36]])
3.3 示例
四、numpy广播
x
的列数 必须等于y
的行数,这不属于广播的情况,还是矩阵乘法
对x
的行进行广播,至与y
同维,再对应元素相乘
对x
的行和列进行广播,至与y
同维,再对应元素相乘