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的官方文档来寻找需要的函数和有用的功能。