教程 > SciPy 教程 > SciPy 教程 阅读:60

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]

查看笔记

扫码一下
查看教程更方便