SciPy使用优化的 ATLAS LAPACK 和 BLAS 库构建.它具有非常快速的线性代数功能.所有这些线性代数例程都期望一个可以转换为二维数组的对象.这些例程的输出也是一个二维数组.
SciPy.linalg vs 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 命令,该命令可以更快,更稳定.
求解函数有两个输入'a'和'b',其中'a'代表系数,'b'代表相应的右手边值并返回解决方案数组.
让我们考虑以下示例.
#importing the scipy and numpy packagesfrom scipy import linalgimport numpy as np#Declaring the numpy arraysa = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]])b = np.array([2, 4, -1])#Passing the values to the solve functionx = linalg.solve(a, b)#printing the result arrayprint x
上述程序将生成以下输出.
array([2., - 2.,9.))
查找行列式
方阵A的行列式通常表示为| A |并且是线性代数中经常使用的量.在SciPy中,这是使用 det()函数计算的.它需要一个矩阵作为输入并返回一个标量值.
让我们考虑下面的例子.
#importing the scipy and numpy packagesfrom scipy import linalgimport numpy as np#Declaring the numpy arrayA = np.array([[1,2],[3,4]])#Passing the values to the det functionx = linalg.det(A)#printing the resultprint x
上述程序将生成以下输出.
-2.0
特征值和特征向量
特征值 - 特征向量问题是最常用的问题之一线性代数运算.通过考虑以下关系 : ,我们可以找到方形矩阵(A)的特征值(λ)和相应的特征向量(v);
Av =λv
scipy.linalg.eig 根据普通或广义特征值问题计算特征值.此函数返回特征值和特征向量.
让我们考虑以下示例.
#importing the scipy and numpy packagesfrom scipy import linalgimport numpy as np#Declaring the numpy arrayA = np.array([[1,2],[3,4]])#Passing the values to the eig functionl, v = linalg.eig(A)#printing the result for eigen valuesprint l#printing the result for eigen vectorsprint v
以上程序将生成以下输出.
array([-0.37228132+0.j, 5.37228132+0.j]) #--Eigen Valuesarray([[-0.82456484, -0.41597356], #--Eigen Vectors [ 0.56576746, -0.90937671]])
奇异值分解
奇异值分解(SVD)可以被认为是特征值问题对不是方形的矩阵的扩展e.
scipy.linalg.svd 将矩阵'a'分解为两个酉矩阵'U'和'Vh'以及一维数组' s'的奇异值(真实的,非负的)使得a == U * S * Vh,其中'S'是一个适当形状的零矩阵,主对角线's'.
让我们考虑以下示例.
#importing the scipy and numpy packagesfrom scipy import linalgimport numpy as np#Declaring the numpy arraya = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)#Passing the values to the eig functionU, s, Vh = linalg.svd(a)# printing the resultprint 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] ]))