SciPy 线性代数
SciPy 是使用经过优化后的ATLAS LAPACK和BLAS库构建的。它具有非常快的线性代数能力。所有这些线性代数对象都需要一个可以转换为二维数组的对象。这些对象的输出也是一个二维数组。
SciPy.linalg 与 NumPy.linalg
scipy.linalg 包含 numpy.linalg 中的所有函数。此外,scipy.linalg 还有一些 numpy.linalg 没有的高级功能。与 numpy.linalg 相比,使用 scipy.linalg 的另一个优点是它一直使用 BLAS/LAPACK 进行编译,而对于 NumPy,这些是可选的。因此,根据 NumPy 的不同的安装方式,SciPy 版本可能会更快。
线性方程组
使用 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 值,我们可以使用矩阵逆求出解向量,如下所示
但是,最好的方式是使用linalg.solve,它可以更快且数值更稳定。
solve() 方法可以有两个输入“a”和“b”,其中“a”代表系数,即 x、y、z前面各自的常数值,“b”代表各自右侧的值,即每个方程等号后面的值。该方法放回的是一个解数组。
from scipy import linalg
import numpy as np
#声明numpy的数组
a = np.array([[1, 3, 5], [2, 5, 1], [2, 3, 8]])
b = np.array([10, 8, 3])
#求解方程
res = linalg.solve(a, b)
#打印结果
print(res)
运行结果如下
[-9.28 5.16 0.76]
计算方阵的行列式
方阵 A 的行列式通常表示为 |A|
是线性代数中常用的一个量。在 SciPy 中,使用det()方法计算行列式。它接受一个矩阵作为输入并返回一个标量值。
from scipy import linalg
import numpy as np
A = np.array([[3,6],[2,7]])
# 计算矩阵A的行列式
x = linalg.det(A)
print(x)
运行结果如下
9.0
特征值和特征向量
特征值-特征向量问题是最常用的线性代数运算之一。我们可以通过考虑以下关系找到方阵 (A) 的特征值 (λ) 和相应的特征向量 (v)
Av = λv
使用 linalg.eig() 方法来计算特征值和特征向量,其返回值就是要求解的特征值和特征向量
from scipy import linalg
import numpy as np
A = np.array([[1,2],[3,4]])
l, v = linalg.eig(A)
#打印特征值
print(l)
#打印特征向量
print(v)
运行结果如下
[-0.37228132+0.j 5.37228132+0.j]
[[-0.82456484 -0.41597356]
[ 0.56576746 -0.90937671]]
奇异值分解
奇异值分解 (SVD) 可以被认为是特征值问题对非方矩阵的扩展。
scipy.linalg.svd方法将矩阵“a”分解为两个酉矩阵“U”和“Vh”以及奇异值(实、非负)的一维数组“s”,使得a==U*s*Vh
,其中“s”是具有主对角线“s”的适当形状的零矩阵。
from scipy import linalg
import numpy as np
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)
U, s, Vh = linalg.svd(a)
print(U, Vh, s)
运行结果如下
[[-0.41864354-0.00233284j 0.25759629-0.34200335j -0.62833249+0.4965967j ]
[ 0.43908698+0.48411689j 0.61752761-0.39867232j 0.03609973-0.17677757j]
[-0.36713701-0.51261683j 0.39910664-0.34221599j 0.57001895-0.03339002j]]
[[ 0.46955149+0.j 0.85886896+0.2046106j ]
[-0.88290509+0.j 0.45676846+0.10881715j]]
[3.18604443 0.47733258]