教程 > scipy 教程 > 阅读:70

scipy 线性代数——迹忆客-ag捕鱼王app官网

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]

查看笔记

扫码一下
查看教程更方便
网站地图