numpy中的矩阵A*B和np.dot(A,B)的区别问题

一.我们先来看一维向量之间的结果
import numpy as np
a = np.array([1,2])
b = np.array([3,4]) 
c = np.array([[3],[4]])

print(a)
print(b)
print(c)

输出结果

[1 2]
[3 4]
[[3]
 [4]]

1.现在先验证A*B的形式

print(b*a) #行向量之间
print(a*c)  #行向量和列向量之间
print(c*a)

我们可以看到无论是行向量相乘还是列向量乘积都是对应左边的乘积。

[3 8]
[[3 6]
 [4 8]]
[[3 6]
 [4 8]]

2.验证 np.dot(A,B)形式

输入:

print(np.dot(a,b))
print(np.dot(a,c))

输出:

11
[11]

而输入

print(np.dot(c,a))

输出:

ValueError: shapes (2,1) and (2,) not aligned: 1 (dim 1) != 2 (dim 0)

二:我们看二维情况下

输入代码

import numpy as np



a = np.array([[1,2],[3,4]])
b = np.array([[1,1],[2,2]])

print(a)
print(b)

输出:

[[1 2]
 [3 4]]
[[1 1]
 [2 2]]

1.验证A*B类型

输入:

print(a*b)
print(b*a)

输出:

[[1 2]
 [6 8]]
[[1 2]
 [6 8]]

2.验证np.dot(A,B)

输入:

print(np.dot(a,b))
print(np.dot(b,a))
输出:
[[ 5  5]
 [11 11]]
[[ 4  6]
 [8 12]]

三:一维和二维之间

输入:

import numpy as np



a = np.array([1,2])
b = np.array([[1,1],[2,2]])


print(a)
print(b)

输出:

[1 2]
[[1 1]
 [2 2]]

1.A*B类型

输入:

print(a*b)
print(b*a)

输出:

[[1 2]
 [2 4]]
[[1 2]
 [2 4]]

2.np.dot(A,B)类型

输入:

print(np.dot(a,b))

print(np.dot(b,a))

输出:

[5 5]

[3 6]


四:规律总结

我们发现A*B的形式  是做对应点的乘积类似于matlab里面的A.*b ,并且维度不同的时候会自动复制补齐维度让二者维度一致再做计算。例如[1,2]*[[1,1],[2,2]]是把[1,2]从1X2的形式扩展到了2X2 再进行计算的


而需要特别值得注意的是dot(A,B)这个函数,这个函数执行的是严格的矩阵乘法 类似于MATLAB的 A*B

但是它对于只有一个list符号比较宽松,什么意思呢,例如[1,2]是一个list符号,而[[1],[2]]是两个list符号括起来的,我们认为这已经是矩阵了。而对于只有一个list符号的处理起来很宽松,做矩阵乘法的时候,可以随时充当列向量或者行向量使用 根据需要灵活处理

也就是所,矩阵计算的时候[1,2]既可以做行向量也可以是列向量,而[[1,2]]就只能是行向量了,而[[1],[2]]只能是列向量。




添加一点其他知识:

np.linalg.det(mat)求行列式

np.linalg.inv(mat)求逆

eig1,eig2 = np.linalg.eig(mat)求特征向量和特征值 eig1是特征值,eig2是特征向量

猜你喜欢

转载自blog.csdn.net/wqtltm/article/details/79882928