【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吧!

相关文章
相关标签/搜索