Numpy 线性代数

import numpy as np

# 通过列表或元组直接生成数组
A = [[1, 2, 3, 4], [5, 6 ,7, 8]]
B = ((1,2,3,4), (5,6,7,8))
arr1 = np.array(A)
arr2 = np.array(B)
print(A, arr1)
print(B, arr2)

#随机生成数组
arr1 = np.random.random((2,3)) #默认范围是[0,1]
arr2 = np.random.randint(1, 10, size=[2,3]) #随机生成整数
print(arr1, arr2)

# 通过reshape修改数组形状
arr1 = arr1.reshape(3, -1) #未知参数可用-1代替,这里是(3,2)
print(arr1)

# 数组的存取
C = np.arange(0, 12, 1) #生成range[0, 12, 1]的一维数组
C = C.reshape(3, 4) #修改形状
print(C)
print("C[1:2]=", C[1:2]) #1行2列元素,从0开始计数
print("C[0]=", C[0]) #第0行
print("C[ : ,0]=", C[:,0]) #第0列
print("C[1:2, 0:3:1]=", C[1:2, 0:3:1]) #以range(1,4,1)方式取列
print("C[1:2, [1, 2]=", C[1:2, [1, 2]]) # 以列表形式指定取哪些列
print("C[:, -1]=", C[:, -1]) #以负数形式指定倒数第几列,从-1开始计数
print("C[C > 5]=", C[C > 5]) #bool索引,C > 5返回一个bool类型的同型数组,输出为一维数组

# 生成特殊矩阵
z = np.zeros((3, 4)) #零矩阵
o = np.ones((3, 4)) #元素为1的矩阵
e = np.eye(3) #单位矩阵
d = np.diag([1,2,3,4]) #对角矩阵
print(z, o, e, d)
print(np.diag(z)) #取矩阵的主对角元

# 数组的广播机制
# 广播是对不同形状 的数组进行计算的方法
# 当两个不同型的数组计算时,会先通过复制得到新数组来计算
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
b = np.ones((1,4))
print(a*b, a+b)

# 二维数组(矩阵)的乘法
A = np.arange(12).reshape(3,4)
B = np.ones((3,4))
print(A * B) # 按元素相乘
print(A @ B.T) # 按矩阵意义相乘, .T代表转置

# 逆矩阵, 行列式, 矩阵的秩
C = np.random.random(9).reshape(3, 3)
C_inv = np.linalg.inv(C) #求逆矩阵
E = np.round(np.array(C@C_inv), 0) #round是进行四舍五入
print(C, C_inv, E)

C = np.random.randint(0,10, size=[3,3])
print(C, "det=", np.linalg.det(C), 0) #求行列式
print("rank=", np.linalg.matrix_rank(C)) #求矩阵的秩

# 线性方程组的解
A = np.eye(3)
B = np.linspace(2,4,3)
X = np.linalg.solve(A, B) #Ax = B的解
print(X)

# 向量的欧氏度量
A = np.linspace(1, 3, 3) #依闭区间[1,3]创建一个3元的一维向量
B = np.linspace(4, 6, 3)
A_B = np.dot(A, B.T) #向量内积dot,必须是行向量与列向量相乘
print("A@B=", A_B)
A_norm = np.linalg.norm(A)
print("|A|=", A_norm)

# 特征值与特征向量
A = np.array([[4, 2], [1, 5]])
eig_val ,eig_vex = np.linalg.eig(A) #返回特征值与特征向量
print("eig_val=", eig_val, "\n eig_vex=", eig_vex)

# SVD分解
A = np.arange(12).reshape(3, 4)
U, S , V = np.linalg.svd(A) #返回U,奇异值s(向量),V 使得A=USV
Sigma = np.zeros(shape=np.shape(A))
Sigma[:len(S), :len(S)] = np.diag(S)
print("U=", U, "V=", V, "S=", S)
print("U@Sigma@V = ", np.round(U@Sigma@V, 0))

# 利用SVD重构矩阵
A = np.arange(100).reshape(10, -1)
U, S, V = np.linalg.svd(A)
k = 3 #只取前k个(最大的)特征值
Sigma = np.diag(S[:k])
_U = U[:, :k] #U取前k列
_V = V[:k, :] #V取前k行
print("压缩后的A = ", np.round(_U @ Sigma @ _V, 1))

    所属分类:Python     发表于2022-02-04