【Python】尽量不要用python进行矩阵计算!

先抛出一个概念:

左乘:设A为m*p的矩阵,B为p*n的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记作C=AB,称为A左乘以B。

           左乘是做行变换;

           用对角阵左乘一个矩阵,就是用对角阵的对角元分别乘这个矩阵的对应各行;

右乘:设A为m*p的矩阵,B为p*n的矩阵,那么度称m*n的矩阵C为矩阵A与B的乘积,记作版C=AB,称为B右乘以A。

          右乘是做列变换;

           用对角阵右乘一个矩阵,就是用对角阵的对角元分别乘这个矩阵的对应各列。

 

然后说结论:千万别用python的numpy进行矩阵计算!!!!!!!!!!!!

(1)如果通过numpy包进行矩阵计算,可能把数组误认为矩阵!

比如numpy.diag([1,2,3]),返回是对角矩阵的形式,你以为是矩阵,其实是数组!

当你发现所有矩阵乘法都变成数组乘法的时候,很恐怖的一件事!

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

你可能感兴趣的:(Python编程手册)