np.dot np.matmul np.mutiply @ *
我自己最近总是混淆这几个运算,今天做一个总结。
先导概念
标量
一个标量就是一个数
向量
向量可以看做标量的集合,可以通过标量在这个集合中的顺序进行索引
矩阵
矩阵是二维数组,其中的每一个元素被两个索引而非一个所确定。
张量
几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量。
可以将任意一张彩色图片表示成一个三阶张量,三个维度分别是图片的高度、宽度和色彩数据。
点积
点积一般来讲也叫内积,数量积。但是点积和内积也是有一些差别的,想继续了解的可以去看下参考博客第三个,我在这里尝试做一个概括,内积是更一般意义上的点积,比如在一段区间内的积分其实就是在做内积。f * dx 并求和。
∫
a
b
f
d
x
\int_a^b {f} \,{\rm d}x
∫abfdx
对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。
哈达玛积
Hadamard product(又称element-wise product):对应元素相乘,二者维数必须相同。
几种操作的结果
NumPy Array | NumPy Matrix | NumPy Array Vector | |
---|---|---|---|
np.multiply(A, B) | Hadamard Product | Hadamard Product | Hadamard Product |
np.dot(A, B) | Matrix Multiplication | Matrix Multiplication | Sum of Hadamard Product |
A * B | Hadamard Product | Matrix Multiplication | Hadamard Product |
np.matmul(A, B) | Matrix Multiplication | Matrix Multiplication | Sum of Hadamard Product |
A @ B | Matrix Multiplication | Matrix Multiplication | Sum of Hadamard Product |
示例
mutiply and *
array
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[1, 1], [2, 2]])
c = np.multiply(A, B)
print(c)
[[1 2]
[6 8]]
A * B
array([[1, 2],
[6, 8]])
matrix
A = np.mat(A)
B = np.mat(B)
c = np.multiply(A,B)
print(c)
[[1 2]
[6 8]]
A * B
matrix([[ 5, 5],
[11, 11]])
vector
A = np.array([1, 2, 3, 4])
B = np.array([1, 1, 2, 2])
c = np.multiply(A,B)
print(c)
[1 2 6 8]
A * B
array([1, 2, 6, 8])
matmul and dot
array
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[1, 1], [2, 2]])
c = np.dot(A, B)
print(c)
[[ 5 5]
[11 11]]
np.matmul(A, B)
array([[ 5, 5],
[11, 11]])
A @ B
array([[ 5, 5],
[11, 11]])
matrix
A = np.mat(A)
B = np.mat(B)
c = np.dot(A,B)
print(c)
[[ 5 5]
[11 11]]
np.matmul(A, B)
matrix([[ 5, 5],
[11, 11]])
A @ B
matrix([[ 5, 5],
[11, 11]])
vector
A = np.array([1, 2, 3, 4])
B = np.array([1, 1, 2, 2])
c = np.dot(A,B)
print(c)
17
np.matmul(A, B)
17
A @ B
17
总结
当进行向量的内积运算时,可以通过np.dot()
当进行矩阵的乘法运算时,可以通过np.matmul()或者@
当进行标量的乘法运算时,可以通过np.multiply()或者*