SciPy Linalg
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 = 3begin{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 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 == USVh,其中’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]
])
)