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)
m2array([0, 1, 2, 3, 4])m2.T
array([0, 1, 2, 3, 4])#我们也可以把一维数组变成二维数组
m2r = m2.reshape(1,5)
m2rarray([[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 linalgm3 = 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)
qarray([[-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 # varray([[-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]])
m4array([[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
我们现在来求解一个线性方程组。方程组如下:
coeffs  = np.array([[2, 6], [5, 3]])
depvars = np.array([6, -9])
solution = linalg.solve(coeffs, depvars)
solutionarray([-3.,  2.])#检查解是否正确
coeffs.dot(solution), depvars(array([ 6., -9.]), array([ 6, -9]))#另一种检查的方法
np.allclose(coeffs.dot(solution), depvars)True 
Summary
现在我们已经了解了Numpy库的基本操作,但还有很多我们部分可供学习。最好的方法还是在实践中学习Numpy,我们可以参考Numpy的官方文档来寻找需要的函数和有用的功能。