前述文章中,我们已经初步学习了矩阵形数组(以下简称为“矩阵”)加减法和乘法运算,本次讨论除法运算。
未来得及一起学习的同学可以参考以下链接:
【1】array矩阵除法
按照先前学习惯例,先完成矩阵定义。此处以使用array模块定义3X3矩阵为例:
import numpy as np #引入numpy模块
a=np.array([[1,2,3],[4,5,6],[7,8,9]]) #使用array子模块定义3X3矩阵
b=np.array([[2,4,6],[8,10,12],[14,16,18]]) #使用array子模块定义3X3矩阵
c=a/b #两个array子模块定义的3X3矩阵直接相除
print('a/b=\n',c) #输出结果,\n用于换行
运行上述代码,输出结果为:
图1
可见,对array模块定义的矩阵,用“/”执行的除法操作,其实是同位置数据的彼此相除。
【2】matrix矩阵除法
参照前述内容,此处以使用matrix模块定义3X3矩阵为例:
d=np.matrix('1,2,3;4,5,6;7,8,9') #使用matrix子模块定义3X3矩阵
e=np.matrix('2,4,6;8,10,12;14,16,18') #使用matrix子模块定义3X3矩阵
f=d/e #两个matrix子模块定义的3X3矩阵直接相除,"/"为除法算符
g=np.divide(d,e) #两个matrix子模块定义的3X3矩阵直接相除,"np.divide()"为除法算符
print('d/e=\n',f) #输出结果,\n用于换行
print('np.divide(d,e)=\n',g) #输出结果,\n用于换行
运行上述代码,输出结果为:
图2
可见,对matrix模块定义的矩阵,用
“/”和 np.divide()
执行的除法操作,其实是同位置数据的彼此相除。
【3】逆矩阵
从线性代数我们知道,矩阵不直接计算除法,而是使用求逆矩阵的形式计算两个矩阵的“商”。
查询numpy官网,numpy模块使用numpy.linalg.inv模块进行逆矩阵求解,链接如下;
https://numpy.org/doc/stable/reference/generated/numpy.linalg.inv.html#numpy.linalg.inv
此外,官网教程贴心示例,用“@”作为矩阵乘法计算符。
图3
基于此,我们尝试重新定义矩阵,并寻求输出逆矩阵。
【3.1】array模块求解逆矩阵
首先使用array模块定义矩阵并求其逆矩阵,输入以下代码:
import numpy as np #引入numpy模块
from numpy.linalg import inv #引入inv逆矩阵求解模块
a=np.array([[1,2,7],[5,6,8],[9,10,2]]) #使用array子模块定义3X3矩阵
b=np.array([[2,5,6],[8,7,12],[14,15,18]]) #使用array子模块定义3X3矩阵
c=inv(a) #矩阵a的逆矩阵
d=inv(b) #矩阵b的逆矩阵
print('矩阵a的逆矩阵为:\n',c) #输出结果,\n用于换行
print('矩阵b的逆矩阵为:\n',d) #输出结果,\n用于换行
获得运行结果如下:
图4
虽然上述结果已出,但仍需十分小心,我们反过来让两个矩阵做一下乘法运算:
e=a*c #“ * ”作乘法计算符的结果
f=b*d #“ * ”作乘法计算符
e1=a@c #“@”作乘法计算符
f1=b@d #“@”作乘法计算符
print('a*c=\n',e) #“ * ”作乘法计算符的结果,\n表示换行
print('b*d=\n',f) #“ * ”作乘法计算符的结果,\n表示换行
print('a@c=\n',e1) #“ @ ”作乘法计算符的结果,\n表示换行
print('b@d=\n',f1) #“ @ ”作乘法计算符的结果,\n表示换行
获得结果如下:
图5
由图可见:
【a】“ * ”作乘法计算符的结果是,同一位置的数据彼此相乘;
【b】“@”作乘法计算符的结果是,两个矩阵按行列相乘后叠加。
【3.2】matrix模块求解逆矩阵
直接使用matrix模块定义矩阵并求其逆矩阵,输入以下代码:
aa=np.matrix('1,2,7;5,6,8;9,10,2') #使用matrix子模块定义3X3矩阵
bb=np.matrix('2,5,6;8,7,12;14,15,18') #使用matrix子模块定义3X3矩阵
cc=inv(aa) #矩阵a的逆矩阵
dd=inv(bb) #矩阵b的逆矩阵
print('矩阵aa的逆矩阵为:\n',cc) #输出结果,\n用于换行
print('矩阵bb的逆矩阵为:\n',dd) #输出结果,\n用于换行
获得如下结果:
图6
如图6所示,逆矩阵结果与图4完全一致。
继续让两个矩阵做一下乘法运算:
ee=aa*cc #“ * ”作乘法计算符
ff=bb*dd #“ * ”作乘法计算符
ee1=aa@cc #“@”作乘法计算符
ff1=bb@dd #“@”作乘法计算符
print('aa*cc=\n',ee) #“ * ”作乘法计算符的结果,\n表示换行
print('bb*dd=\n',ff) #“ * ”作乘法计算符的结果,\n表示换行
print('aa@cc=\n',ee1) #“ @ ”作乘法计算符的结果,\n表示换行
print('bb@dd=\n',ff1) #“ @ ”作乘法计算符的结果,\n表示换行
获得如下结果:
图7
由图7可知:用“ * ”或者“@”作乘法计算符的结果一样,两个矩阵按行列相乘后叠加。
附完整版代码如下:
import numpy as np #引入numpy模块
from numpy.linalg import inv #引入inv逆矩阵求解模块
a=np.array([[1,2,7],[5,6,8],[9,10,2]]) #使用array子模块定义3X3矩阵
b=np.array([[2,5,6],[8,7,12],[14,15,18]]) #使用array子模块定义3X3矩阵
c=inv(a) #矩阵a的逆矩阵
d=inv(b) #矩阵b的逆矩阵
print('矩阵a的逆矩阵为:\n',c) #输出结果,\n用于换行
print('矩阵b的逆矩阵为:\n',d) #输出结果,\n用于换行
e=a*c #“ * ”作乘法计算符
f=b*d #“ * ”作乘法计算符
e1=a@c #“@”作乘法计算符
f1=b@d #“@”作乘法计算符
print('a*c=\n',e) #“ * ”作乘法计算符的结果,\n表示换行
print('b*d=\n',f) #“ * ”作乘法计算符的结果,\n表示换行
print('a@c=\n',e1) #“ @ ”作乘法计算符的结果,\n表示换行
print('b@d=\n',f1) #“ @ ”作乘法计算符的结果,\n表示换行
aa=np.matrix('1,2,7;5,6,8;9,10,2') #使用matrix子模块定义3X3矩阵
bb=np.matrix('2,5,6;8,7,12;14,15,18') #使用matrix子模块定义3X3矩阵
cc=inv(aa) #矩阵a的逆矩阵
dd=inv(bb) #矩阵b的逆矩阵
print('矩阵aa的逆矩阵为:\n',cc) #输出结果,\n用于换行
print('矩阵bb的逆矩阵为:\n',dd) #输出结果,\n用于换行
ee=aa*cc #“ * ”作乘法计算符
ff=bb*dd #“ * ”作乘法计算符
ee1=aa@cc #“@”作乘法计算符
ff1=bb@dd #“@”作乘法计算符
print('aa*cc=\n',ee) #“ * ”作乘法计算符的结果,\n表示换行
print('bb*dd=\n',ff) #“ * ”作乘法计算符的结果,\n表示换行
print('aa@cc=\n',ee1) #“ @ ”作乘法计算符的结果,\n表示换行
print('bb@dd=\n',ff1) #“ @ ”作乘法计算符的结果,\n表示换行
【4】其他乘除法运算模块讨论
大家在阅读代码的时候,经常会看到使用multiply()和devide()进行乘除法计算,官网说明可参考链接:
https://numpy.org/doc/stable/reference/generated/numpy.multiply.html
https://numpy.org/doc/stable/reference/generated/numpy.divide.html
【4.1】array模块乘法运算符对比
此处我们直接定义矩阵,通过输出结果测试这两个模块的输出结果。首先输入以下代码:
import numpy as np #引入numpy模块
from numpy.linalg import inv #引入inv逆矩阵求解模块
from numpy.ma.core import multiply
a=np.array([[1,2,7],[5,6,8],[9,10,2]]) #使用array子模块定义3X3矩阵
b=np.array([[2,5,6],[8,7,12],[14,15,18]]) #使用array子模块定义3X3矩阵
c=a*b #“ * ”作乘法计算符
d=a@b #“@”作乘法计算符
e=np.multiply(a,b) #“np.multiply”作乘法计算符
print('a*b=\n',c) #输出结果,\n用于换行
print('a@b=\n',d) #输出结果,\n用于换行
print('np.multiply(a,b)=\n',e) #输出结果,\n用于换行
获得如下结果:
图8
由图8可见:
【a】“ * ”和“multiply”作乘法计算符的结果是,同一位置的数据彼此相乘;
【b】“@”作乘法计算符的结果是,两个矩阵按行列相乘后叠加。
【4.2】matrix模块乘法运算符对比
继续输入以下代码:
aa=np.matrix('1,2,7;5,6,8;9,10,2') #使用matrix子模块定义3X3矩阵
bb=np.matrix('2,5,6;8,7,12;14,15,18') #使用matrix子模块定义3X3矩阵
cc=aa*bb #“ * ”作乘法计算符
dd=aa@bb #“@”作乘法计算符
ee=np.multiply(aa,bb) #“np.multiply”作乘法计算符
print('aa*bb=\n',cc) #输出结果,\n用于换行
print('aa@bb=\n',dd) #输出结果,\n用于换行
print('np.multiply(aa,bb)=\n',ee) #输出结果,\n用于换行
获得结果如下:
图8
由图8可见:
【a】“ * ”和“@”作乘法计算符的结果是,两个矩阵按行列相乘后叠加;
【b】“multiply”作乘法计算符的结果是,同一位置的数据彼此相乘。
【4.3】array模块除法运算符对比
继续输入以下代码:
#array定义矩阵除法运算符测试
f=a/b #“ / ”作乘法计算符
g=np.divide(a,b) #“ divide ”作乘法计算符
print('a/b=\n',f) #输出结果,\n用于换行
print('np.divide(a,b)=\n',g) #输出结果,\n用于换行
获得结果如下:
图9
由图9可见:对于array模块定义矩阵,“ / ”和“devide”作除法计算符的结果一致,同一位置的数据彼此相除。
【4.4】matrix模块除法运算符对比
继续输入以下代码:
#matrix定义矩阵除法运算符测试
ff=aa/bb #“ / ”作乘法计算符
gg=np.divide(aa,bb) #“ divide ”作乘法计算符
print('aa/bb=\n',ff) #输出结果,\n用于换行
print('np.divide(aa,bb)=\n',gg) #输出结果,\n用于换行
获得结果如下:
图10
由图9可见:对于matrix模块定义矩阵,“ / ”和“devide”作除法计算符的结果一致,同一位置的数据彼此相除。
至此,大家进行矩阵的乘除法运算时,一定要谨慎使用计算符,以免出错。
【5】总结
综上所述,获得以下结论:
【a】在numpy模块中使用numpy.linalg.inv子模块,可进行逆矩阵求解;
【b】对array模块定义的矩阵,“ * ”作乘法计算符的结果是,同一位置的数据彼此相乘;“@”作乘法计算符的结果是,两个矩阵按行列相乘后叠加。
【c】对matrix模块定义的矩阵,“ * ”和“@”作乘法计算符的结果是,两个矩阵按行列相乘后叠加;“multiply”作乘法计算符的结果是,同一位置的数据彼此相乘。
【d】对于array模块定义矩阵,“ / ”和“devide”作除法计算符的结果一致,同一位置的数据彼此相除。
【e】对于matrix模块定义矩阵,“ / ”和“devide”作除法计算符的结果一致,同一位置的数据彼此相除。