Python的向量和矩阵乘法意义大全包括dot和*的区别(2020)

Python的向量和矩阵乘法意义大全

最近在用python练习算法,牵涉到一些数学公式,但对python各个相乘符号的意义不是很了解,索性就都实现了一遍,罗列在下面啦,也可以自己复制过去一个一个验证啦

#python 矩阵和向量相乘的意义
#Author:sw
#Time:2020/10/10

import numpy as np

#向量与向量相乘
a = np.array([1,2]) #为行向量(1,2) shapes(2,)
b = np.array([1,2,3])#为行向量(1,2,3) shapes(3,)
#print(a*b) #会报错
#print(a.dot(b))#显然也会报错

c = np.array([1,1,2])#为行向量(1,1,2) shapes(3,)
# print(b*c) #答案为[1,2,6] 为对应位置的数相乘(*)
# print(c*b) #答案为[1,2,6] 为对应位置的数相乘(*)

# print(b.dot(c))#答案为9,运行的是矩阵乘法,自动转置了
# print(c.dot(b))#答案为9,运行的是矩阵乘法,自动转置了
# print(c.T.dot(b))#答案为9,运行的是矩阵乘法,自己转置也行
# print(b.T.dot(c))#答案为9,运行的是矩阵乘法,自己转置也行

#向量和矩阵相乘
d=np.array([[2,1,3],[1,1,1],[1,1,1]]) #为矩阵[[2 1 3]
                                      #      [1 1 1]
                                      #      [1 1 1]]
# print(a*d)#显然报错,维数不符合矩阵乘法的规则
# print(b*d) #答案为[[2 2 9]
           #      [1 2 3]
           #      [1 2 3]]
           #很容易看出来这是矩阵每一行对应位置的数和行向量对应位置的数相乘(*)了
#print(d*b)#交换顺序答案不变
#print(b.T*d)#答案与上面相同,说明矩阵和向量相乘(*)一定是对应位置,无论是行向量还是列向量
#print(d*b.T)#答案与上面相同,说明矩阵和向量相乘(*)一定是对应位置,无论向量在前还是在后

# print(d.dot(a))#显然报错,维数不符合矩阵乘法的规则
# print(b.dot(d))#答案为[7 6 8]7=1*2+2*1+3*16=1*1+2*1+3*1,8=3*1+2*1+3*1
               #答案的第一列的数字由行向量b乘以矩阵第一列按矩阵乘法得到,第二列和第三列一样的方法得到
# print(d.dot(b))#答案为[13 6 6],每一行的数字由矩阵对应行乘以向量对应位置得到,例如13=2*1+1*2+3*3
               #可以想象为矩阵乘以了一个列向量


#矩阵与矩阵相乘
e=np.array([[1,1,1],[1,2,1],[3,1,1]]) #为矩阵[[1 1 1]
                                      #      [1 1 1]
                                      #      [3 1 1]]
# print(d*e) #答案为[[2 1 3]
           #     [1 2 1]
           #    [3 1 1]]
           #可以看到为对应位置数乘
# print(e*d) #答案与上面相同

# print(e.dot(d)) #答案为 [[ 4  3  5]
                #      [ 5  4  6]
                #      [ 8  5 11]]
                # 和我们熟悉的矩阵乘法规则同
# print(d.dot(e)) #答案为 [[12  7  6]
                #      [ 5  4  3]
                #      [ 5  4  3]]
                # 和我们熟悉的矩阵乘法规则同,第一个矩阵的行和第二个矩阵的列相乘

你可能感兴趣的:(算法,python,人工智能,机器学习,线性代数)