作为一名菜鸟级初学者,在进行python numpy模块练习的时候发现
import numpy as np
from numpy import *
A=[[8,1,6],[3,5,7],[4,9,2]]
aa=linalg.inv(A)*A
print (aa)
运行结果:
[[ 1.17777778 -0.14444444 0.38333333]
[-0.18333333 0.11111111 0.73888889]
[-0.07777778 1.7 -0.20555556]]
当时觉得世界崩塌了,这种计算的结果难道不是单位阵吗?但是博主坚信电脑是不会错的,只可能是自已的问题。为了发现问题
博主做了print (linalg.inv(A))
的操作
发现结果和matlab算的一样,居然是对的。
[[ 0.14722222 -0.14444444 0.06388889]
[-0.06111111 0.02222222 0.10555556]
[-0.01944444 0.18888889 -0.10277778]]
这就很奇怪了。当时觉得这个编绎器可能有bug,于是换了另一个,但是结果还是一样的。
再后来,想到了python里还有np.dot的运算,于是将程序改为
import numpy as np
from numpy import *
A=[[8,1,6],[3,5,7],[4,9,2]]
aa=linalg.inv(A)*A
print (aa)
bb=np.dot(linalg.inv(A),A)
print(bb)
运行结果为
[[ 1.17777778 -0.14444444 0.38333333]
[-0.18333333 0.11111111 0.73888889]
[-0.07777778 1.7 -0.20555556]]
[[ 1.00000000e+00 0.00000000e+00 5.55111512e-17]
[-5.55111512e-17 1.00000000e+00 -5.55111512e-17]
[ 5.55111512e-17 9.71445147e-17 1.00000000e+00]]
可以看出np.dot计算的是传统矩阵相乘,而*号运算计算的不知道是什么。。。
但是python能这样计算肯定有它的道理,经过仔细观察后,博主发现前边的结果是矩阵对应位置处两个数相乘的结果,也就是matlab中的点乘操作,而后者才是真正的矩阵相乘的结果。
另外,经过验证发现如果在矩阵定义时采用np.mat函数,那么也可以用*号实现矩阵的相乘
程序修改为:
import numpy as np
from numpy import *
A=np.mat([[8,1,6],[3,5,7],[4,9,2]])
aa=linalg.inv(A)*A
print (aa)
bb=np.dot(linalg.inv(A),A)
print(bb)
运行结果为:
[[ 1.00000000e+00 0.00000000e+00 5.55111512e-17]
[-5.55111512e-17 1.00000000e+00 -5.55111512e-17]
[ 5.55111512e-17 9.71445147e-17 1.00000000e+00]]
[[ 1.00000000e+00 0.00000000e+00 5.55111512e-17]
[-5.55111512e-17 1.00000000e+00 -5.55111512e-17]
[ 5.55111512e-17 9.71445147e-17 1.00000000e+00]]
可以看出,np.dot和*号计算结果相同。因此在使用numpy进行矩阵计算时一定要注意二者的区别(一个菜鸟的忠告)。