【scipy 基础】--线性代数
SciPy的linalg模块是SciPy库中的一个子模块,它提供了许多用于线性代数运算的函数和工具,如矩阵求逆、特征值、行列式、线性方程组求解等。
相比于NumPy的linalg模块,SciPy的linalg模块包含更多的高级功能,并且在处理一些特定的数值计算问题时,可能会表现出更好的性能。
1. 主要功能
scipy.linalg模块主要功能包括:
| 类别 | 主要函数 | 说明 |
|---|---|---|
| 基础运算 | 包含inv,slove等20多个函数 | 求解逆矩阵,线性方程等等 |
| 特征值问题 | 包含eig,eigvals等8个函数 | 求解各种类型矩阵的特征值 |
| 分解运算 | 包含lu,svd等将近30个函数 | 矩阵的LU分解,奇异值分解等等 |
| 矩阵运算 | 包含logm,sinm,cosm等10多个函数 | 计算矩阵的对数,指数,sin,cos等等 |
| 矩阵方程求解 | 包含solve_sylvester,solve_continuous_are等5个函数 | 计算西尔维斯特方程,CARE,DARE等代数方程 |
| 特殊矩阵运算 | 包含blcok_diag,circulant等将近30个函数 | 创建块对角矩阵,循环矩阵,相伴矩阵等等 |
| 其他 | 包含4个函数 | BLAS,LSPACK等函数对象 |
Scipy库的线性代数模块包含将近100个各类函数,用于解决线性代数中的各类计算问题。
下面演示几种通过scipy.linalg来进行的常用计算。
2. 矩阵计算
提起线性代数,就不得不提矩阵运算。
2.1. 特征值
矩阵的特征值和特征向量是矩阵理论中的重要概念,它们分别代表了矩阵对某些向量进行变换时所具有的特定的拉伸和旋转效果。
具体来说,对于一个给定的矩阵\(A\),如果存在一个非零的向量\(v\),使得\(Av\)是\(v\)的一个固定的倍数,
即\(Av = \lambda v\),那么\(\lambda\)就是\(A\)的一个特征值,\(v\)就是对应于特征值\(\lambda\)的特征向量。
特征值和特征向量在许多领域都有应用,包括图像处理、信号处理、数据压缩、物理学、经济学等。
它们在求解线性方程组、判定矩阵的稳定性、计算矩阵的秩等数学问题中也有重要的应用。
import numpy as np
import scipy.linalg as sla
A = np.random.rand(3, 3)
sla.eigvals(A)
# 运行结果(返回特征值)
array([0.87067114+0.j, 0.25270355+0.j, 0.52811777+0.j])
sla.eig(A)
# 运行结果(返回特征值和特征向量)
(array([0.87067114+0.j, 0.25270355+0.j, 0.52811777+0.j]),
array([[-0.55290631, -0.88616977, -0.80241551],
[-0.73988407, 0.44869198, -0.51813093],
[-0.38323122, 0.11566608, 0.29609067]]))
eigvals函数返回的是特征值,eig函数返回的是特征值和对应的特征向量。
2.2. 奇异值
特征值和特征向量是针对方阵的,也就是NxN的矩阵。
实际场景中,很多矩阵并不是方阵,为了了解这类矩阵,就要对其进行奇异分解。
具体来说,对于一个m×n的矩阵A,奇异分解就是将其分解为三个矩阵的乘积:
- 一个
m×r的矩阵U - 一个
r×r的对称正定矩阵S - 以及一个
r×n的矩阵V
其中r是由A的奇异值所决定的。A的奇异值就是S矩阵的对角线元素,也就是A的正特征值的非负平方根。
这些奇异值反映了矩阵A在一些方向上的拉伸或压缩效果。
# 创建一个 4x3 的矩阵
A = np.random.rand(4, 3)
# 奇异分解,得到 U,S,V矩阵
U, S, V = sla.svd(A)
print("奇异值: {}".format(S))
# 运行结果
奇异值: [1.6804974 0.67865812 0.3322078 ]
2.3. 逆矩阵
逆矩阵是指对于一个n阶方阵A,如果存在一个n阶方阵B,使得AB=BA=E,
则称方阵A是可逆的,并称方阵B是A的逆矩阵。
其中E是单位矩阵。
逆矩阵的重要意义在于它可以表示为某个线性变换的逆变换,从而在逆变换的研究和应用中起到关键作用。
此外,逆矩阵还与方程组的解、行列式的性质等领域紧密相关。
A = np.random.rand(3, 3)
# 求解逆矩阵
sla.inv(A)
# 运行结果:
array([[-1.41573129, 0.13168502, 1.5952333 ],
[ 3.572943 , -1.02580488, 1.10932935],
[-2.82777937, 2.10823192, -2.39404249]])
# 非方阵
A = np.random.rand(4, 3)
# 非方阵求解逆矩阵会抛出异常
sla.inv(A)
# 运行结果:
ValueError: expected square matrix
Scipy库用inv函数求解逆矩阵非常简单,注意只有方阵能求解逆矩阵。
3. 线性方程组
其实求解线性方程组本质也是矩阵运算,比如下面的线性方程组:
\(\begin{cases}
\begin{align*}
3x+2y-z \quad & = 1\\
-y+3z \quad & = -3 \\
2x-2z \quad & =2
\end{align*}
\end{cases}\)
求解方式转换为系数矩阵和结果向量,然后求解:
# 创建一个系数矩阵
A = np.array([[3, 2, -1], [0, -1, 3], [2, 0, -2]])
# 创建一个结果向量
b = np.array([1, -3, 2])
# 使用solve函数求解线性方程组
ret = sla.solve(A, b)
# 输出解向量
print("Solution vector ret:", ret)
# 运行结果:
Solution vector x: [ 0. -0. -1.]
4. 总结
本篇概要介绍了Scipy库的linalg模块,并演示了如何应用在求解矩阵和线性方程组。
linalg模块提供了非常丰富的各类函数,这里演示的几个函数目的是为了展示其使用方法,
线性代数中的各类运算几乎都可以在此模块中找到相应的函数。
【scipy 基础】--线性代数的更多相关文章
- SciPy 基础功能
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- 算法库:基础线性代数子程序库(Basic Linear Algebra Subprograms,BLAS)介绍
调试DeepFlow光流算法,由于作者给出的算法是基于Linux系统的,所以要在Windows上运行,不得不做大量的修改工作.移植到Windows平台,除了一些头文件找不到外,还有一些函数也找不到.这 ...
- SciPy 线性代数
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- Python教程:进击机器学习(五)--Scipy《转》
Scipy简介 文件输入和输出scipyio 线性代数操作scipylinalg 快速傅里叶变换scipyfftpack 优化器scipyoptimize 统计工具scipystats Scipy简介 ...
- python-数据处理的包Numpy,scipy,pandas,matplotlib
一,NumPy包(numeric python,数值计算) 该包主要包含了存储单一数据类型的ndarry对象的多维数组和处理数组能力的函数ufunc对象.是其它包数据类型的基础.只能处理简单的数据分析 ...
- SciPy 信号处理
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 统计
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 图像处理
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 优化
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- SciPy 积分
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
随机推荐
- Django日志输出
# 自定义日志输出信息 LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'standard': ...
- SpringBoot3基础用法
目录 一.背景 二.环境搭建 1.工程结构 2.框架依赖 3.环境配置 三.入门案例 1.测试接口 2.全局异常 3.日志打印 3.1 日志配置 3.2 日志打印 四.打包运行 五.参考源码 技术和工 ...
- linux设置信号量系统参数
前言 信号量是IPC(进程间通信)机制的一种,用于协调多个进程或线程对共享数据的读写操作,本质上是一个计数器.类似于锁,主要用于保护共享资源,控制同时访问资源的进程数. 信号量只允许调用者对它进行等待 ...
- 批量获取FreeSWITCH所有分机号及其密码
前言 有次项目上需要获取所有FreeSWITCH注册分机的分机号和密码,就用python写了个小脚本来获取. 可以先把freeswitch/conf/directory/default/目录下的所有x ...
- Deno 中使用 @typescript/vfs 生成 DTS 文件
背景 前段时间开源的 STC 工具,这是一个将 OpenApi 规范的 Swagger/Apifox 文档转换成代码的工具.可以在上一篇(<OpenApi(Swagger)快速转换成 TypeS ...
- 2023-08-24:请用go语言编写。给定一个长度为n的数组arr, 现在你有一次机会, 将其中连续的K个数全修改成任意一个值, 请你计算如何修改可以使修改后的数 列的最长不下降子序列最长。 请输出
2023-08-24:请用go语言编写.给定一个长度为n的数组arr, 现在你有一次机会, 将其中连续的K个数全修改成任意一个值, 请你计算如何修改可以使修改后的数 列的最长不下降子序列最长. 请输出 ...
- numpy和pandas的基本用法
安装numpy模块 pip install numpy 可以通过导入numpy模块来使用它 import numpy as np 1.创建数组: a = np.array([1, 2, 3, 4, 5 ...
- 微信小程序隐私保护协议修改方法 uniapp
微信隐私保护协议指南 一天天没事闲的 01 在manifest.json 中添加一行 "__usePrivacyCheck__" : false 02 自定义一个弹窗组件 ...
- windows下flutter的环境安装
Flutter是谷歌出品的移动应用SDK,性能卓越.体验精美.跨平台.HotReload等等这些特点. Dart是谷歌推出的编程语言.支持即时编译JIT(Just In Time).HotReload ...
- C#集成ViewFaceCore人脸检测识别库
前言 人脸检测与识别现在已经很成熟了,C# 上有 ViewFaceCore 这个很方便的库,但这种涉及到 native 调用的库,一般会有一些坑,本文记录一下开发和部署的过程. 本文的项目是 AIHu ...