Python学习-Numpy库矩阵的各种运算

Python学习-Numpy库矩阵的各种运算

目录

1、行列式运算:求值、特殊行列式生成

2、矩阵运算:嵌套、转置、求逆、乘积、线性方程组求解

3、向量运算:外积、内积、叉积、特征值、特征向量

Numpy库矩阵运算

1、行列式运算

1)行列式计算:行数与列数一致

D = np.array([[1, 2], [3, 4]])
v1 = np.linalg.det(D)  # 行列式求值
print(v1)
输出
-2.0000000000000004

2)特殊行列式绘制

范德蒙行列式
vm = np.vander(x=[1, 2, 3], N=3, increasing=True)  
# x为一维组合,N为列数,increasing:False从右往左扩展,True从左往右扩展
print(vm)
输出
[[1 1 1]
 [1 2 4]
 [1 3 9]]
下三角行列式
t1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
nt = np.tril(m=t1, k=0)  # 默认k=0,标准下三角行列式
print(nt)
nt = np.tril(m=t1, k=1)  # k=-1,主对角线上元素全为0。k=1,对角线为0的往右上方移1位
print(nt)
nt = np.tril([1, 2, 3])  # 提供主对角线元素
print(nt)
输出
[[1 0 0]
 [4 5 0]
 [7 8 9]]
 
[[1 2 0]
 [4 5 6]
 [7 8 9]]
 
[[1 0 0]
 [1 2 0]
 [1 2 3]]
上三角行列式:np.triu(m, k=0) # m为行列式或者对角线数组,k取-1,0,1
建立基于1、0元素的三角行列式
vt = np.tri(N=3, M=3, k=0, dtype=float)  # N为行数,M为列数,dtype为指定返回类型
print(vt)
输出
[[1. 0. 0.]
 [1. 1. 0.]
 [1. 1. 1.]]
获取主对角线的值
t1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
d = np.diag(t1)
print(d)
输出
[1 5 9]
指定对角线元素,并产生其他元素为0的行列式
df = np.diagflat(v=[[1, 2], [3, 4]], k=0)  
# v可为一维数组。k为0,元素在对角线上,k为-1,元素在对角线向左下方移一位,k为1,元素在对角线向右上方移一位
print(df)
输出
[[1 0 0 0]
 [0 2 0 0]
 [0 0 3 0]
 [0 0 0 4]]

2、矩阵计算

1)构建嵌套矩阵

t1 = np.array([1, 2, 3])
t2 = np.array([4, 5, 6])
M1 = np.matrix(data=t1, dtype=None, copy=True)  # dtype:输出类型,copy;True,深度复制,False,视图
M2 = np.matrix(data=t2, dtype=None, copy=True)
print(M1)
M = np.bmat([[M1], [M2]])  # 构建嵌套矩阵
print(M)
输出
[[1 2 3]]

[[1 2 3]
 [4 5 6]]

2)构建坐标(网格)矩阵

x = np.arange(3)
y = np.arange(4)
X, Y = np.meshgrid(x, y)
print(X)
print(Y)
输出
[[0 1 2]
 [0 1 2]
 [0 1 2]
 [0 1 2]]
 
[[0 0 0]
 [1 1 1]
 [2 2 2]
 [3 3 3]]
返回网格矩阵的索引
x, y = np.indices(dimensions=(3, 3), dtype=int)  # 返回网格矩阵的索引,dimensions可为3维
print(x)
print(y)
输出
[[0 0 0]
 [1 1 1]
 [2 2 2]]
 
[[0 1 2]
 [0 1 2]
 [0 1 2]]

3)矩阵转置

t1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
M = np.matrix(data=t1, dtype=None, copy=True)
m = M.T
print(m)
输出
[[1 4 7]
 [2 5 8]
 [3 6 9]]

4)移动轴位置

m1 = np.arange(24).reshape(2, 3, 4)
print(m1)
print(m1[0, 1, 1])
m = np.moveaxis(a=m1, source=0, destination=-1)  # a为集合对象,source为轴开始移动位置,destination为轴移入位置,0--1表示从左到右,-1-0表示从右到左
print(m)
m = np.rollaxis(a=m1, axis=-1, start=0)  # 向后滚动指定轴,axis为结束位置,start为开始滚动的轴
print(m)
m = np.swapaxes(a=m1, axis1=0, axis2=2)  # 交换两轴位置,axis为交换轴维数
print(m)
m = np.transpose(a=m1, axes=(0, 2, 1))
print(m.shape)
输出
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]
 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
  
5

[[[ 0 12]
  [ 1 13]
  [ 2 14]
  [ 3 15]]
 [[ 4 16]
  [ 5 17]
  [ 6 18]
  [ 7 19]]
 [[ 8 20]
  [ 9 21]
  [10 22]
  [11 23]]]
  
[[[ 0  4  8]
  [12 16 20]]
 [[ 1  5  9]
  [13 17 21]]
 [[ 2  6 10]
  [14 18 22]]
 [[ 3  7 11]
  [15 19 23]]]
  
[[[ 0 12]
  [ 4 16]
  [ 8 20]]
 [[ 1 13]
  [ 5 17]
  [ 9 21]]
 [[ 2 14]
  [ 6 18]
  [10 22]]
 [[ 3 15]
  [ 7 19]
  [11 23]]]
  
(2, 4, 3)

5)矩阵的逆矩阵,矩阵可逆的前提是矩阵的行列式为0

D = np.array([[1, 2], [3, 4]])
M = np.matrix(D)
if np.linalg.det(M) != 0:
    print(np.linalg.inv(M))
    print(np.linalg.pinv(a=M, rcond=1e-15))  # 广义逆矩阵(伪逆矩阵),rcond为误差值
else:
    print("LinAlgError")
输出
[[-2.   1. ]
 [ 1.5 -0.5]]
 
[[-2.   1. ]
 [ 1.5 -0.5]]

6)矩阵乘积

a = np.ones(4).reshape(2, 2)
b = np.array([[1, 2], [3, 4]])
c = np.dot(a, b)  # 乘积,标量dot(10, 10)
d = np.inner(b, a)  # 内积
e = np.matmul(a, b)  # 乘积,不允许用标量
print(c)
print(d)
print(e)
输出
[[4. 6.]
 [4. 6.]]
 
[[3. 3.]
 [7. 7.]]
 
[[4. 6.]
 [4. 6.]]

7)求线性方程组:系数矩阵行列式不为0,线性方程组有唯一解

A = np.array([[1, -1, -1], [2, -1, -3], [3, 2, -5]])  # 系数矩阵
b = [2, 1, 0]  # 常数项
x = np.linalg.solve(A, b)
print(x)
输出
[ 5.00000000e+00 -2.37904934e-16  3.00000000e+00]

8)求线性方程组的最小二乘解

A = np.array([[1, -1, -1], [2, -1, -3], [3, 2, -5]])  # 系数矩阵
b = [2, 1, 0]  # 常数项
x1 = np.linalg.lstsq(a=A, b=b, rcond=None)[0]  # rcond为a的最小奇异值的截距比
print(x1)
输出
[5.0000000e+00 1.1481579e-15 3.0000000e+00]

3、向量、特征向量、特征值

1)向量的积

v1 = np.arange(3).reshape(1, 3)
print(v1)
v2 = np.ones(3).reshape(3, 1)
print(v2)
vo = np.outer(v2, v1)  # 求向量外积,列 X 行
print(vo)
vi = np.inner(v1, v1)  # 求向量内积,vdot():支持复数
print(vi)
# vc = np.cross(a=v1, b=v2, axisa=-1, axisb=-1, axisc=-1, axis=None)  # 向量的叉积
输出
[[0 1 2]]

[[1.]
 [1.]
 [1.]]
 
[[0. 1. 2.]
 [0. 1. 2.]
 [0. 1. 2.]]
 
[[5]]

2)求方阵的特征值、特征向量

A = np.matrix([[3, -1], [-1, 3]])
w, v = np.linalg.eig(A)  # w为特征值,v为特征向量
print('特征值', w)
print('特征向量', v)
输出
特征值: [4. 2.]
特征向量: [[ 0.70710678  0.70710678]
 [-0.70710678  0.70710678]]

3)求厄密特矩阵或实对称矩阵的特征值和特征向量

A1 = np.matrix([[1, 1j], [-1j, 1]])
w, v = np.linalg.eigh(A1, UPLO='L')  # L:代表上三角,U:代表下三角
print('特征值', w)
print('特征向量', v)
输出
特征值: [0. 2.]
特征向量: [[-0.70710678-0.j         -0.70710678+0.j        ]
 [ 0.        -0.70710678j  0.        +0.70710678j]]

4)求方阵的特征值

w1 = np.linalg.eigvals(A)
w2 = np.linalg.eigvalsh(A1)  # 厄密特矩阵或实对称矩阵的特征值
# print('特征值', w1)
# print('特征向量', w2)
输出
特征值: [4. 2.]
特征向量: [0. 2.]

你可能感兴趣的:(IT,python,numpy,线性代数,矩阵)