numpy中的各种乘法

点乘,叉乘,内积,外积,数量积,向量积。

前言

做数字图像处理的时候会需要卷积,虽然 OpenCV 自带了对应的函数filter2D()来进行卷积,
不过实验嘛,还是自己动手理解原理才是最好的。不过 numpy 的各种乘法混着看不懂有啥区别啊,所以就看看咯。

正文

下面我会把满足条件的方法合并起来演示。

点乘、内积、数量积

简单地说就是将数组 a 中的每个元素与数组 b 中的每一个对应位置的元素相乘,相乘的结果放在和数组 a 相同大小的数组中。

下面就用 python来演示下咯

array 与 array 求点乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np

a = [[163,162,161],[162,162,162],[162,162,163]]
b = [[0,1,0],[1,-4,1],[0,1,0]]
a = np.array(a)
b = np.array(b)

a*b

array([[ 0, 162, 0],
[ 162, -648, 162],
[ 0, 162, 0]])

np.multiply(a,b)

array([[ 0, 162, 0],
[ 162, -648, 162],
[ 0, 162, 0]])

mat 与 mat 求点乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np

a = [[163,162,161],[162,162,162],[162,162,163]]
b = [[0,1,0],[1,-4,1],[0,1,0]]
a = np.mat(a)
b = np.mat(b)


np.multiply(a,b)

matrix([[ 0, 162, 0],
[ 162, -648, 162],
[ 0, 162, 0]])

mat 与 array 求点乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np

a = [[163,162,161],[162,162,162],[162,162,163]]
b = [[0,1,0],[1,-4,1],[0,1,0]]
a = np.mat(a)
b = np.array(b)


np.multiply(a,b)
matrix([[ 0, 162, 0],
[ 162, -648, 162],
[ 0, 162, 0]])


叉乘、外积、向量积

array 与 array 求叉乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np

a = [[163,162,161],[162,162,162],[162,162,163]]
b = [[0,1,0],[1,-4,1],[0,1,0]]
a = np.array(a)
b = np.array(b)

np.matmul(a,b)

array([[ 162, -324, 162],
[ 162, -324, 162],
[ 162, -323, 162]])

np.dot(a,b)

array([[ 162, -324, 162],
[ 162, -324, 162],
[ 162, -323, 162]])

mat 与 mat 求叉乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import numpy as np

a = [[163,162,161],[162,162,162],[162,162,163]]
b = [[0,1,0],[1,-4,1],[0,1,0]]
a = np.mat(a)
b = np.mat(b)

a*b
matrix([[ 162, -324, 162],
[ 162, -324, 162],
[ 162, -323, 162]])

np.dot(a,b)

matrix([[ 162, -324, 162],
[ 162, -324, 162],
[ 162, -323, 162]])

np.matmul(a,b)

matrix([[ 162, -324, 162],
[ 162, -324, 162],
[ 162, -323, 162]])

mat 与 array 求叉乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np

a = [[163,162,161],[162,162,162],[162,162,163]]
b = [[0,1,0],[1,-4,1],[0,1,0]]
a = np.mat(a)
b = np.array(b)

a*b
matrix([[ 162, -324, 162],
[ 162, -324, 162],
[ 162, -323, 162]])

np.dot(a,b)

matrix([[ 162, -324, 162],
[ 162, -324, 162],
[ 162, -323, 162]])

np.matmul(a,b)

matrix([[ 162, -324, 162],
[ 162, -324, 162],
[ 162, -323, 162]])

多说一句,这里的 mat 和 array 的顺序可以前后交换。

总结

目标\类型 array 与 array mat 与 mat mat 与 array
点乘、内积、数量积 a * b或者np.multiply(a,b) np.multiply(a,b) np.multiply(a,b)
叉乘、外积、向量积 np.dot(a,b) 或者 np.matmul(a,b) a*b 或者 np.dot(a,b) 或者 np.matmul(a,b) a*b 或者 np.dot(a,b) 或者 np.matmul(a,b)

这个时候可以看到

  1. 在求点乘的情况下,除了 array 与 array 相乘可以用 a*b 其他类型都应该用 np.multiply(a,b)
  2. 在求叉积的情况下,除了 array 与 array 相乘可以用 a*b 其他类型用几种乘法都可以。

求卷积

卷积就是求了点乘之后把矩阵求和,然后把这个和作为结果放入新的矩阵中。

array 与 array 求卷积

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

a = [[163,162,161],[162,163,162],[162,162,163]]
b = [[0,1,0],[1,-4,1],[0,1,0]]
a = np.array(a)
b = np.array(b)

np.sum(a*b)

-4

np.vdot(a,b)

-4

mat 与 mat 求卷积

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

a = [[163,162,161],[162,163,162],[162,162,163]]
b = [[0,1,0],[1,-4,1],[0,1,0]]
a = np.mat(a)
b = np.mat(b)

np.sum(np.multiply(a,b))

-4

mat 与 array 求卷积

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

a = [[163,162,161],[162,163,162],[162,162,163]]
b = [[0,1,0],[1,-4,1],[0,1,0]]
a = np.mat(a)
b = np.array(b)

np.sum(np.multiply(a,b))

-4

参考

向量内积(点乘)和外积(叉乘)概念及几何意义

卷积及理解图像卷积操作的意义

NumPy 线性代数


numpy中的各种乘法
https://www.yikakia.com/numpy中的各种乘法/
作者
Yika
发布于
2020年6月2日
许可协议