谨慎使用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)
到此这篇关于谨慎使用Python进行矩阵计算解析的文章就介绍到这了,更多相关Python 矩阵计算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!