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)
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)
print(nt)
nt = np.tril(m=t1, k=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)
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)
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)
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)
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)
print(m)
m = np.rollaxis(a=m1, axis=-1, start=0)
print(m)
m = np.swapaxes(a=m1, axis1=0, axis2=2)
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))
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)
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]
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)
print(vo)
vi = np.inner(v1, v1)
print(vi)
输出
[[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)
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')
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)
输出
特征值: [4. 2.]
特征向量: [0. 2.]