Numpy库实现矩阵乘法以及元素级乘法

  • 想要实现线性代数中讲过的矩阵乘法,即符合矩阵相乘的两个矩阵需要满足条件:第一个矩阵的列数等于第二个矩阵的行数。使用numpy的库函数:np.matmul。如果参与matmul运算的两个矩阵尺寸不满足上述条件则会报错
a = np.array([[1,2,3,4],[5,6,7,8]])
a
# 显示以下结果:
# array([[1, 2, 3, 4],
#  [5, 6, 7, 8]])
a.shape
# 显示以下结果:
# (2, 4)
 
b = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
b
# 显示以下结果:
# array([[ 1, 2, 3],
#  [ 4, 5, 6],
#  [ 7, 8, 9],
#  [10, 11, 12]])
b.shape
# 显示以下结果:
# (4, 3)
 
c = np.matmul(a, b)
c
# 显示以下结果:
# array([[ 70, 80, 90],
#  [158, 184, 210]])
c.shape
# 显示以下结果:
# (2, 3)
  • 想要实现两个尺寸一致的矩阵的内积运算,可以直接使用符号"*" 或者np.multiply函数:内积运算需要保证参与运算的两个矩阵具有相同的尺寸
m = np.array([[1,2,3],[4,5,6]])
m
# 显示以下结果:
# array([[1, 2, 3],
#  [4, 5, 6]])
 
n = m * 0.25
n
# 显示以下结果:
# array([[ 0.25, 0.5 , 0.75],
#  [ 1. , 1.25, 1.5 ]])
 
m * n
# 显示以下结果:
# array([[ 0.25, 1. , 2.25],
#  [ 4. , 6.25, 9. ]])
 
np.multiply(m, n) # 相当于 m * n
# 显示以下结果:
# array([[ 0.25, 1. , 2.25],
#  [ 4. , 6.25, 9. ]])
  • 关于np.dot函数:如果参与运算的两个矩阵满足:第一个矩阵的列数等于第二个矩阵的行数,这个条件的话,那么np.dot运算出来的结果和np.matmul的结果一致,即传统线性代数中的矩阵乘法。
a = np.array([[1,2],[3,4]])
a
# 显示以下结果:
# array([[1, 2],
#  [3, 4]])
 
np.dot(a,a)
# 显示以下结果:为正常的矩阵乘法运算
# array([[ 7, 10],
#  [15, 22]])
 
a.dot(a) # you can call你可以直接对 `ndarray` 调用 `dot` 
# 显示以下结果:
# array([[ 7, 10],
#  [15, 22]])
 
np.matmul(a,a)
# 当两个矩阵的尺寸满足矩阵运算的条件时,np.dot和np.matmul的结果一致
# array([[ 7, 10], 
#  [15, 22]])

np.dot()函数的官方用法:

  • 当参与运算的两个变量都是1D数组时,相当于向量的内积:
a = [1,2,3]
b = [2,2,2]
c = np.dot(a,b)
print(c) # 输出:12
  • If both a and b are 2-D arrays, it is matrix multiplication, but using matmul or a @ b is preferred. 就相当于上面说的矩阵乘法
a = [[1,2],[3,4]]
b = [[1,2],[3,4]]
c = np.dot(a,b)
print(c) 

# 输出:
# [[ 7 10]
# [15 22]]
  • 如果a或b是0-D(标量),则等效于相乘,并且最好使用numpy.multiply(a,b)或a * b。
print(np.dot(3,4)) # 12
  • If a is an N-D array and b is a 1-D array, it is a sum product over the last axis of a and b.即参与运算的两个数组的尺寸需要满足:第一个数组的最后一维的大小要和第二个一维数组的个数相同。例如,a是一个二维矩阵,那么a的列数(a的最后一维的个数)要等与b中元素的个数
a = [[1,2,3],[2,3,4]]
b = [1,2,3]
c = np.dot(a,b)
print(c) # 输出:[14 20]

c中的元素计算过程:
c[0] = 1x1+2x2+3x3 = 14
c[1] = 2x1+3x2+4x3 = 20

  • If a is an N-D array and b is an M-D array (where M>=2), it is a sum product over the last axis of a and the second-to-last axis of b:
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])

Numpy库实现矩阵乘法以及元素级乘法_第1张图片

参考连接:
[1] https://www.jb51.net/article/208029.htm
[2] https://numpy.org/doc/stable/reference/generated/numpy.dot.html

你可能感兴趣的:(numpy,python,numpy)