numpy 中的各种乘法

本文最后更新于:2020年8月16日 下午

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

前言

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

正文

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

点乘、内积、数量积

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

下面就用 python 来演示下咯

array 与 array 求点乘

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 求点乘

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 求点乘

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 求叉乘

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 求叉乘

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 求叉乘

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 求卷积

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 求卷积

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 求卷积

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 线性代数


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!