- SciPy 教程
- SciPy - 首页
- SciPy - 简介
- SciPy - 环境设置
- SciPy - 基本功能
- SciPy - 聚类
- SciPy - 常量
- SciPy - FFTpack
- SciPy - 积分
- SciPy - 插值
- SciPy - 输入和输出
- SciPy - 线性代数
- SciPy - Ndimage
- SciPy - 优化
- SciPy - 统计
- SciPy - CSGraph
- SciPy - 空间
- SciPy - ODR
- SciPy - 特殊包
- SciPy 有用资源
- SciPy - 参考
- SciPy - 快速指南
- SciPy - 有用资源
- SciPy - 讨论
SciPy - 线性代数
SciPy 使用经过优化的ATLAS LAPACK 和 BLAS 库构建。它具有非常快速的线性代数功能。所有这些线性代数例程都期望一个可以转换为二维数组的对象。这些例程的输出也是一个二维数组。
SciPy.linalg 与 NumPy.linalg
scipy.linalg 包含 numpy.linalg 中的所有函数。此外,scipy.linalg 还有一些 numpy.linalg 中没有的其他高级函数。与 numpy.linalg 相比,使用 scipy.linalg 的另一个优势在于,它始终使用 BLAS/LAPACK 支持进行编译,而对于 NumPy,这是可选的。因此,SciPy 版本的速度可能会更快,具体取决于 NumPy 的安装方式。
线性方程
scipy.linalg.solve 功能求解线性方程 a * x + b * y = Z,以求解未知的 x、y 值。
例如,假设需要求解以下联立方程组。
x + 3y + 5z = 10
2x + 5y + z = 8
2x + 3y + 8z = 3
为了求解上述方程的 x、y、z 值,我们可以使用如下所示的矩阵逆法找到解向量。
$$\begin{bmatrix} x\\ y\\ z \end{bmatrix} = \begin{bmatrix} 1 & 3 & 5\\ 2 & 5 & 1\\ 2 & 3 & 8 \end{bmatrix}^{-1} \begin{bmatrix} 10\\ 8\\ 3 \end{bmatrix} = \frac{1}{25} \begin{bmatrix} -232\\ 129\\ 19 \end{bmatrix} = \begin{bmatrix} -9.28\\ 5.16\\ 0.76 \end{bmatrix}.$$
但是,最好使用linalg.solve 命令,它可能更快且数值稳定性更好。
solve 函数接受两个输入“a”和“b”,其中“a”表示系数,“b”表示相应的右侧值,并返回解数组。
让我们考虑以下示例。
#importing the scipy and numpy packages from scipy import linalg import numpy as np #Declaring the numpy arrays a = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]]) b = np.array([2, 4, -1]) #Passing the values to the solve function x = linalg.solve(a, b) #printing the result array print x
以上程序将生成以下输出。
array([ 2., -2., 9.])
求行列式
方阵 A 的行列式通常表示为 |A|,是线性代数中经常使用的量。在 SciPy 中,这是使用det() 函数计算的。它接受一个矩阵作为输入并返回一个标量值。
让我们考虑以下示例。
#importing the scipy and numpy packages from scipy import linalg import numpy as np #Declaring the numpy array A = np.array([[1,2],[3,4]]) #Passing the values to the det function x = linalg.det(A) #printing the result print x
以上程序将生成以下输出。
-2.0
特征值和特征向量
特征值-特征向量问题是最常用的线性代数运算之一。我们可以通过考虑以下关系找到方阵 (A) 的特征值 (λ) 和相应的特征向量 (v):
Av = λv
scipy.linalg.eig 计算普通或广义特征值问题的特征值。此函数返回特征值和特征向量。
让我们考虑以下示例。
#importing the scipy and numpy packages from scipy import linalg import numpy as np #Declaring the numpy array A = np.array([[1,2],[3,4]]) #Passing the values to the eig function l, v = linalg.eig(A) #printing the result for eigen values print l #printing the result for eigen vectors print v
以上程序将生成以下输出。
array([-0.37228132+0.j, 5.37228132+0.j]) #--Eigen Values array([[-0.82456484, -0.41597356], #--Eigen Vectors [ 0.56576746, -0.90937671]])
奇异值分解
奇异值分解 (SVD) 可以被认为是将特征值问题扩展到非方阵的矩阵。
scipy.linalg.svd 将矩阵“a”分解为两个酉矩阵“U”和“Vh”以及一个包含奇异值(实数,非负)的一维数组“s”,使得 a == U*S*Vh,其中“S”是一个形状合适的零矩阵,其主对角线为“s”。
让我们考虑以下示例。
#importing the scipy and numpy packages from scipy import linalg import numpy as np #Declaring the numpy array a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2) #Passing the values to the eig function U, s, Vh = linalg.svd(a) # printing the result print U, Vh, s
以上程序将生成以下输出。
( array([ [ 0.54828424-0.23329795j, -0.38465728+0.01566714j, -0.18764355+0.67936712j], [-0.27123194-0.5327436j , -0.57080163-0.00266155j, -0.39868941-0.39729416j], [ 0.34443818+0.4110186j , -0.47972716+0.54390586j, 0.25028608-0.35186815j] ]), array([ 3.25745379, 1.16150607]), array([ [-0.35312444+0.j , 0.32400401+0.87768134j], [-0.93557636+0.j , -0.12229224-0.33127251j] ]) )