线性代数
矩阵乘积
矩阵的內积操作,如果是一维数组的话就是內积,多维数组的话就是乘积操作
x=np.random.randint(1,11,[5,2])
y=np.random.randint(7,17,[2,5])
z=np.dot(x,y)
print(z)
#[[111 144 151 104 125]
#[ 51 72 77 46 61]
# [131 156 160 127 139]
#[103 132 138 97 115]
#[ 27 36 38 25 31]]
#一维数组
a=np.random.randint(1,10)
b=np.random.randint(2,11)
c=np.dot(a,b)
print(c)#21
矩阵的特征值和特征向量
满足A*v=xv矩阵,其中v是特征向量,x为特征值,A 为方阵
- linalg.eig(A):计算两个,返回的第一个值是特征值,第二个值是特征向量
- linalg.eigvals(A):计算特征值
- 计算特征值和特征向量
x=np.array([[1,0,0],[0,2,0],[0,0,3]],dtype='int32')
z=np.linalg.eigvals(x)
print(z)#1,2,3
# 两个值同时计算
v,z=np.linalg.eig(x)
print(v)
print(z)
#输出
[1. 2. 3.]
[1. 2. 3.]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
- 验证特征值和特征向量
使用allclose函数检验函数是否相等,这个函数判定两个数值的元素是否都为True
x=np.array([[1,0,0],[0,2,0],[0,0,3]])
print(x)
z=np.linalg.eigvals(x)
print(z)#1,2,3
v,y=np.linalg.eig(x)
print(v)
print(y)
for i in [0,1,2]:
if np.allclose(v[i]*y[:,i],np.dot(x,y[:,i])):
print('good')
else:
print("***")
行列式
- 求解行列式
x=np.array([[1,2],[3,4]])
np.linalg.det(x)
矩阵的秩
np.linalg.matrix_rank(a)
方阵的迹
就是主对角线的和
np.trace(a)
#还可以计算副对角线的
np.trace(a,offset=1,-1....)
解方程,求逆矩阵
求解方程组
逆矩阵满足AB=BA=E,其中矩阵的秩必须要满秩,即方阵的DET不为0
- 求逆矩阵
x=np.array([[1,1,0],[0,2,0],[0,0,3]])
a=np.linalg.det(x)
a_inverse=np.linalg.inv(x)
print(a_inverse)
#验证,eye:单位矩阵
x=np.allclose(np.dot(A,a_inverse),np.eye(3))
#求解伴随矩阵A* =a_inverse*|A|
A*=a_inverse*|A|
- 求解方程组
使用solve求解,其实就是获取一个系数矩阵,和一个值矩阵,只能求解存在解的情况,否则报错
#x+2y+z=7
#2x-y+3z=7
#3x+y+2z=18
A=np.array([[1,2,1],[2,-1,3],[3,1,2]])
b=np.array([7,7,18])
x=np.linalg.solve(A,b)
print(x)