Python的向量和矩陣乘法意義大全包括dot和*的區別(2020)

Bei_Zhai發表於2020-10-10

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]]
                # 和我們熟悉的矩陣乘法規則同,第一個矩陣的行和第二個矩陣的列相乘

相關文章