当前位置:   article > 正文

4.2 线性代数linalg模块

linalg

linalg是Linear Algebra的缩写,NumPy和SciPy都提供了线性代数函数库linalg,SciPy的线性代数库比NumPy更加全面。

4.2.1 基本运算

linalg包含了许多方阵(包括矩阵)的基本运算函数,scipy.linalg.det()函数计算方阵的行列式,示例代码:

  1. >>> from scipy import linalg
  2. >>> arr = np.array([[1, 2], [3, 4]])
  3. >>> linalg.det(arr)
  4. -2.0
  5. >>> arr = np.array([[3, 2],[6, 4]])
  6. >>> linalg.det(arr)
  7. 0.0
  8. >>> linalg.det(np.ones((3, 4))) #无论行列式还是逆矩阵只适用于n阶矩阵的求解
  9. Traceback (most recent call last):
  10. ...
  11. ValueError: expected square matrix
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

scipy.linalg.inv()函数计算方阵的逆,示例代码:

  1. >>> arr = np.array([[1, 2], [3, 4]])
  2. >>> iarr = linalg.inv(arr)
  3. >>> iarr
  4. array([[-2. , 1. ],
  5. [ 1.5, -0.5]])
  6. >>>np.allclose(np.dot(arr, iarr), np.eye(2)) #numpy.allclose()函数用于比较两方阵所有对应元素值,如果完全相同返回真(True),否则返回假(False)
  7. True
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

以下计算奇异阵(行列式为0)的逆,其结果将会报错(LinAlgError),示例代码:

  1. >>>arr = np.array([[3, 2], [6, 4]])
  2. >>>linalg.inv(arr)
  3. Traceback (most recent call last):
  4. ...
  5. ...LinAlgError: singular matrix
  • 1
  • 2
  • 3
  • 4
  • 5

scipy.linalg.norm()函数计算方阵的模,示例代码:

  1. >>>A = np.matrix(np.random.random((2, 2)))
  2. >>>A
  3. >>>linalg.norm(A)
  4. >>>linalg.norm(A, 1)
  5. >>>linalg.norm(A, np.inf)
  • 1
  • 2
  • 3
  • 4
  • 5

4.2.2 解线性方程组

scipy.linalg.solve(A,b)和numpy.linalg.solve(A,b)可以用来解线性方程组Ax=b,即计算x=A-1b。这里,A是mn的方形矩阵,x和b是长为m的向量。有时候A是固定的,需要对多组b进行求解,因此第二个参数也可以是mn的矩阵B。这样计算出来的X也是m*n的矩阵,相当于计算A-1B。
在一些矩阵公式中经常会出现类似于A-1B的运算,它们都可以用solve(A, B)计算,这要比直接逆矩阵然后做矩阵乘法更快捷一些,下面的程序比较solve()和逆矩阵的运算速度,示例代码:

  1. import numpy as np
  2. from scipy import linalg
  3. m, n = 500, 50
  4. A = np.random.rand(m, m)
  5. B = np.random.rand(m, n)
  6. X1 = linalg.solve(A, B)
  7. X2 = np.dot(linalg.inv(A), B)
  8. print(np.allclose(X1, X2))
  9. %timeit linalg.solve(A, B)
  10. %timeit np.dot(linalg.inv(A), B)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4.2.3 特征值和特征向量

n*n的矩阵A可以看作n维空间中的线性变换。若x为n维空间中的一个向量,那么A与x的矩阵乘积就是对x进行线性变换之后的向量。如果x是线性变换的特征向量,那么经过这个线性变换之后,得到的新向量仍然与原来的x保持在同一方向上,但其长度也许会改变。特征向量的长度在该线性变换下缩放的比例称为特征值。即特征向量x满足如下等式,λ的值可以是一个任意复数:Ax=λx。
下面以二维平面上的线性变换矩阵为例,演示特征值和特征向量的几何含义。通过linalg.eig(A)计算矩阵A的两个特征值evalues和特征向量evectors,在evectors中,每一列是一个特征向量。示例代码:

  1. >>> A = np.array([[1, -0.3], [-0.1, 0.9]])
  2. >>> evalues, evectors = linalg.eig(A)
  • 1
  • 2
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/96553
推荐阅读
相关标签
  

闽ICP备14008679号