【Python】儘可能不要用python進行矩陣計算, numpy有大坑!

先拋出一個概念:python

左乘:設A爲m*p的矩陣,B爲p*n的矩陣,那麼稱m*n的矩陣C爲矩陣A與B的乘積,記做C=AB,稱爲A左乘以B。數組

           左乘是作行變換;ide

           用對角陣左乘一個矩陣,就是用對角陣的對角元分別乘這個矩陣的對應各行;spa

右乘:設A爲m*p的矩陣,B爲p*n的矩陣,那麼度稱m*n的矩陣C爲矩陣A與B的乘積,記做版C=AB,稱爲B右乘以A。code

          右乘是作列變換;get

           用對角陣右乘一個矩陣,就是用對角陣的對角元分別乘這個矩陣的對應各列。it

 

而後說結論:千萬別用python的numpy進行矩陣計算!!!!!!!!!!!!class

(1)若是經過numpy包進行矩陣計算,可能把數組誤認爲矩陣!import

好比numpy.diag([1,2,3]),返回是對角矩陣的形式,你覺得是矩陣,實際上是數組!numpy

當你發現全部矩陣乘法都變成數組乘法的時候,很恐怖的一件事!

(2)若是你必定要用numpy,慎用星號*表示乘法!

若是A和B都是數組,A*B是數組乘法(對應元素相乘),返回數組;

若是A和B中有一個是矩陣,A*B默認變成矩陣運算(行列式相乘),返回矩陣;

(3)若是你必定要用numpy,千萬不要用1表示單位矩陣;

1-A,若是A是數組,這裏的1默認爲全1數組(非單位矩陣的形式);

1-A,若是A是矩陣,這裏的1默認爲全1矩陣(非單位矩陣的形式);

真正的單位矩陣,只有對角線元素爲1,其餘元素爲0,用 np.identity(N) 生成單位矩陣;

(4)np.dot(A, B) 是作矩陣運算,可是返回值倒是數組!

舉個例子:在python中,矩陣與數組採用np.dot()計算時,雖然是矩陣計算,可是所得結果均爲一個數組;

數組在前時,可按照將數組當作1行n列的矩陣,與矩陣相乘,可得計算結果。但需注意計算結果依然只是數組,及其shape爲(k,)形式,而不是(1,k);

 

最後附上代碼供理解:

import numpy as np

a = np.diag([1,2,3])
b = np.diag([4,5,6])
c = np.array([[0.1,0.2,0.3],[0.4,0.5,0.6],[0.7,0.8,0.9]])

print("\n區分 h_stack 和 column_stack")
print(np.hstack((a, b)))
print(np.column_stack((a, b)))

print("\n區分 數組乘法 和 矩陣乘法")
print(type(a*c))
print(a*c)
print(type(a.dot(c)))
print(a.dot(c))   # 雖然是矩陣乘法,但返回值爲數組

print("\n區分 全1數組 和 單位矩陣")
print(type(1-a))
print(1-a)
print(type(np.identity(3)-a))
print(np.identity(3)-a)

print("\n數組乘法:(全1數組-a)*對角數組 = (單位數組-a)*對角數組")
print((1-a)*b)
print((np.diag([1,1,1])-a)*b)

print("\n矩陣乘法:全1矩陣x對角數組) != 單位數組x對角數組)")
print((1-a).dot(b))
print(b.dot(1-a))
print(np.dot(1-a, b))
print(np.dot(b, 1-a))


print("\n對角數組 x 數組 = 兩個數組對角元素相乘")
print(type(a*c))
print(a*c)

print("\n對角數組 x 矩陣 = 對角陣的對角元分別乘這個矩陣的對應各行")
d = np.mat(c)
print(type(a*d))
print(a*d)

換matlab吧!

相關文章
相關標籤/搜索