4.2 线性代数linalg模块

来源:互联网 发布:mysql创建序列sql语句 编辑:程序博客网 时间:2024/06/08 06:38

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

4.2.1 基本运算

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

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

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

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

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

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

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

>>>A = np.matrix(np.random.random((2, 2)))>>>A>>>linalg.norm(A)>>>linalg.norm(A, 1)>>>linalg.norm(A, np.inf)

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()和逆矩阵的运算速度,示例代码:

import numpy as npfrom scipy import linalgm, n = 500, 50A = np.random.rand(m, m)B = np.random.rand(m, n)X1 = linalg.solve(A, B)X2 = np.dot(linalg.inv(A), B)print(np.allclose(X1, X2))%timeit linalg.solve(A, B)%timeit np.dot(linalg.inv(A), B)

4.2.3 特征值和特征向量

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

>>> A = np.array([[1, -0.3], [-0.1, 0.9]])>>> evalues, evectors = linalg.eig(A)
原创粉丝点击