赞
踩
linalg是Linear Algebra的缩写,NumPy和SciPy都提供了线性代数函数库linalg,SciPy的线性代数库比NumPy更加全面。
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)
- >>> iarr
- array([[-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)
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 np
- from scipy import linalg
-
- m, n = 500, 50
- A = 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)
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。