Python之Numpy入门实战教程(2):进阶篇之线性代数

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/cg129054036/article/details/86651898

Numpy、Pandas、Matplotlib是Python的三个重要科学计算库,今天整理了Numpy的入门实战教程。NumPy是使用Python进行科学计算的基础库。 NumPy以强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变换和随机数函数。

本文主要介绍Numpy库的重要应用:线性代数,线性代数在机器学习和深度学习中有着广泛的应用。

强烈建议大家将本文中的程序运行一遍。这样能加深对numpy库的使用。
 


目录

1)Matrix transpose

2)Matrix dot product

3)Matrix inverse

4)Identity matrix

5)QR decomposition

6)Determinant

7)Eigenvalues and eigenvectors

8)Singular Value Decomposition

9)Diagonal and trace

10)Solving a system of linear scalar equations


Numpy2维数组在python中可以有效地表示矩阵。 现在我们将快速完成一些主要的矩阵操作。 有关线性代数,向量和矩阵的更多详细信息,请参阅线性代数教程。

1)Matrix transpose

在线性代数里我们学过转置这个概念,我们看看它的代码实现。

m1 = np.arange(10).reshape(2,5)
m1

#输出
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

#矩阵转置
m1.T
array([[0, 5],
       [1, 6],
       [2, 7],
       [3, 8],
       [4, 9]])


#一维数组转置
m2 = np.arange(5)
m2

array([0, 1, 2, 3, 4])

m2.T
array([0, 1, 2, 3, 4])

#我们也可以把一维数组变成二维数组
m2r = m2.reshape(1,5)
m2r

array([[0, 1, 2, 3, 4]])

m2r.T
array([[0],
       [1],
       [2],
       [3],
       [4]])

2)Matrix dot product

我们创建两个矩阵然后进行两个矩阵的乘积运算。矩阵相乘时我们要注意相乘矩阵的维度数。

n1 = np.arange(10).reshape(2, 5)
n1

#输出
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

n2 = np.arange(15).reshape(5,3)
n2

#输出
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]])

#矩阵相乘
n1.dot(n2)

array([[ 90, 100, 110],
       [240, 275, 310]])

3)Matrix inverse

在numpy.linalg模块中包含许多常见线性代数函数,特别是用于计算方阵矩阵逆的inv函数:

import numpy.linalg as linalg

m3 = np.array([[1,2,3],[5,7,11],[21,29,31]])
m3

#输出
array([[ 1,  2,  3],
       [ 5,  7, 11],
       [21, 29, 31]])

linalg.inv(m3)
array([[-2.31818182,  0.56818182,  0.02272727],
       [ 1.72727273, -0.72727273,  0.09090909],
       [-0.04545455,  0.29545455, -0.06818182]])

4)Identity matrix

一个矩阵和它的逆矩阵相乘得到的是单位阵。

#矩阵与自身逆矩阵相乘
m3.dot(linalg.inv(m3))

#输出
array([[ 1.00000000e+00, -1.66533454e-16,  0.00000000e+00],
       [ 6.31439345e-16,  1.00000000e+00, -1.38777878e-16],
       [ 5.21110932e-15, -2.38697950e-15,  1.00000000e+00]])

#创建3x3单位阵
np.eye(3)

array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

5)QR decomposition

在工程问题中,我们经常进行矩阵分解,NumPy也提供了矩阵分解函数。

#矩阵QR分解
q, r = linalg.qr(m3)
q

array([[-0.04627448,  0.98786672,  0.14824986],
       [-0.23137241,  0.13377362, -0.96362411],
       [-0.97176411, -0.07889213,  0.22237479]])

r
array([[-21.61018278, -29.89331494, -32.80860727],
       [  0.        ,   0.62427688,   1.9894538 ],
       [  0.        ,   0.        ,  -3.26149699]])

q.dot(r)
array([[ 1.,  2.,  3.],
       [ 5.,  7., 11.],
       [21., 29., 31.]])

6)Determinant

我们看看如何计算矩阵的行列式。

linalg.det(m3)  
43.99999999999997

7)Eigenvalues and eigenvectors

我们看看如何计算矩阵的特征值和特征向量。

#计算特征值、特征向量
eigenvalues, eigenvectors = linalg.eig(m3)
eigenvalues # λ

array([42.26600592, -0.35798416, -2.90802176])

eigenvectors # v

array([[-0.08381182, -0.76283526, -0.18913107],
       [-0.3075286 ,  0.64133975, -0.6853186 ],
       [-0.94784057, -0.08225377,  0.70325518]])

#验证
m3.dot(eigenvectors) - eigenvalues * eigenvectors  # m3.v - λ*v = 0
array([[ 6.66133815e-15,  1.66533454e-15, -3.10862447e-15],
       [ 7.10542736e-15,  5.16253706e-15, -5.32907052e-15],
       [ 3.55271368e-14,  4.94743135e-15, -9.76996262e-15]])

8)Singular Value Decomposition

我们来进行矩阵的奇异值分解,这经常用来在降低矩阵的运算复杂度。矩阵变得稀疏。

m4 = np.array([[1,0,0,0,2], [0,0,3,0,0], [0,0,0,0,0], [0,2,0,0,0]])
m4

array([[1, 0, 0, 0, 2],
       [0, 0, 3, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 2, 0, 0, 0]])

U, S_diag, V = linalg.svd(m4)
U
#输出
array([[ 0.,  1.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 0.,  0.,  0., -1.],
       [ 0.,  0.,  1.,  0.]])

S_diag
array([3.        , 2.23606798, 2.        , 0.        ])    #只返回对角线的值

#创建返回full维矩阵S_diag
S = np.zeros((4, 5))
S[np.diag_indices(4)] = S_diag
S  # Σ
array([[3.        , 0.        , 0.        , 0.        , 0.        ],
       [0.        , 2.23606798, 0.        , 0.        , 0.        ],
       [0.        , 0.        , 2.        , 0.        , 0.        ],
       [0.        , 0.        , 0.        , 0.        , 0.        ]])

V
array([[-0.        ,  0.        ,  1.        , -0.        ,  0.        ],
       [ 0.4472136 ,  0.        ,  0.        ,  0.        ,  0.89442719],
       [-0.        ,  1.        ,  0.        , -0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  1.        ,  0.        ],
       [-0.89442719,  0.        ,  0.        ,  0.        ,  0.4472136 ]])

#验证
U.dot(S).dot(V) # U.Σ.V == m4
array([[1., 0., 0., 0., 2.],
       [0., 0., 3., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.]])

9)Diagonal and trace

我们看看如何返回矩阵的对角线元素

np.diag(m3) #返回对角线元素
array([ 1,  7, 31])

np.trace(m3) #返回矩阵的迹
39

10)Solving a system of linear scalar equations

我们现在来求解一个线性方程组。方程组如下:

$2x + 6y = 6$

$5x + 3y = -9$

coeffs  = np.array([[2, 6], [5, 3]])
depvars = np.array([6, -9])
solution = linalg.solve(coeffs, depvars)
solution

array([-3.,  2.])

#检查解是否正确
coeffs.dot(solution), depvars

(array([ 6., -9.]), array([ 6, -9]))

#另一种检查的方法
np.allclose(coeffs.dot(solution), depvars)

True


Summary

现在我们已经了解了Numpy库的基本操作,但还有很多我们部分可供学习。最好的方法还是在实践中学习Numpy,我们可以参考Numpy的官方文档来寻找需要的函数和有用的功能。

猜你喜欢

转载自blog.csdn.net/cg129054036/article/details/86651898
今日推荐