SciPy线性代数包是使用优化的ATLAS LAPACK和BLAS库构建的,具有高效的线性代数运算能力。

线性代数包里的函数,操作对象都是二维数组。

SciPy.linalg 与 NumPy.linalg

与NumPy.linalg相比,scipy.linalg除了包含numpy.linalg中的所有函数,还具有numpy.linalg中没有的高级功能。

线性方程组求解

scipy.linalg.solve 函数可用于解线性方程。例如,对于线性方程$a * x + b * y = z$,求出未知数x, y值。

示例

解下面的联立方程组:

$$

x + 3y + 5z = 10 \

2x + 5y + z = 8 \

2x + 3y + 8z = 3

$$

上面的方程组,可以用矩阵表示为:

$$

\left[

\begin{matrix}

1 & 3 & 5 \

2 & 5 & 1 \

2 & 3 & 8

\end{matrix}

\right]

\left[

\begin{matrix}

x \

y \

z

\end{matrix}

\right] =

\left[

\begin{matrix}

10 \

8 \

3

\end{matrix}

\right]

$$

利用矩阵求解上面方程组,如下图所示:

$$

\left[

\begin{matrix}

x \

y \

z

\end{matrix}

\right]

=

\left[

\begin{matrix}

1 & 3 & 5 \

2 & 5 & 1 \

2 & 3 & 8

\end{matrix}

\right]^{-1}

\left[

\begin{matrix}

10 \

8 \

3

\end{matrix}

\right]

= \frac{1}{25}

\left[

\begin{matrix}

-232 \

129 \

19

\end{matrix}

\right]

=

\left[

\begin{matrix}

-9.28 \

5.16 \

0.76

\end{matrix}

\right]

$$

下面我们使用scipy来求解。

scipy.linalg.solve函数接受两个输入,数组a和数组b,数组a表示系数,数组b表示等号右侧值,求出的解将会放在一个数组里返回。

让我们考虑下面的例子。

# 导入scipy和numpy包
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]) # 求解
x = linalg.solve(a, b) # 输出解值
print (x)

输出

[-9.28  5.16  0.76]

计算行列式

矩阵A的行列式表示为$|A|$,行列式计算是线性代数中的常见运算。

SciPy中,可以使用det()函数计算行列式,它接受一个矩阵作为输入,返回一个标量值,即该矩阵的行列式值。

示例

# 导入scipy和numpy包
from scipy import linalg
import numpy as np # 声明numpy数组
A = np.array([[3,4],[7,8]]) # 计算行列式
x = linalg.det(A) # 输出结果
print (x)

输出

-4.0

求取特征值与特征向量

求取矩阵的特征值、特征向量,也是线性代数中的常见计算。

通常,可以根据下面的关系,求取矩阵(A)的特征值(λ)、特征向量(v):

$$ Av = λv $$

scipy.linalg.eig 函数可用于计算特征值与特征向量,函数返回特征值和特征向量。

示例

# 导入scipy和numpy包
from scipy import linalg
import numpy as np # 声明numpy数组
A = np.array([[3,4],[7,8]]) # 求解
l, v = linalg.eig(A) # 打印特征值
print('特征值')
print (l) # 打印特征向量
print('特征向量')
print (v)

上面的程序将生成以下输出。

特征值
[-0.35234996+0.j 11.35234996+0.j]
特征向量
[[-0.76642628 -0.43192981]
[ 0.64233228 -0.90190722]]

SVD奇异值分解

奇异值分解(SVD)是现在比较常见的算法之一,也是数据挖掘工程师、算法工程师必备的技能之一。 假设A是一个$M×N$的矩阵,那么通过矩阵分解将会得到$U,Σ,VT$(V的转置)三个矩阵,其中U是一个$M×M$的方阵,被称为左奇异向量,方阵里面的向量是正交的;Σ是一个$M×N$的对角矩阵,除了对角线的元素其他都是0,对角线上的值称为奇异值;$VT$(V的转置)是一个$N×N$的矩阵,被称为右奇异向量,方阵里面的向量也都是正交的。

$$ A_{m\times{n}} = U_{m\times{m}} Σ_{m\times{n}} V_{n\times{n}}^T$$

让我们考虑下面的例子。

# 导入scipy和numpy包
from scipy import linalg
import numpy as np # 声明numpy数组
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2) # 输出原矩阵
print('原矩阵')
print(a) # 求解
U, s, Vh = linalg.svd(a) # 输出结果
print('奇异值分解')
print(U, "#U")
print(Vh, "#Vh")
print(s, "#s")

上面的程序将生成以下输出。

原矩阵
[[ 1.81840014+0.16615057j -0.47446573-2.36327076j]
[-0.19366846-0.44489565j -0.03227288+0.02260894j]
[-0.91921239-0.99340761j -1.33606096+0.40858722j]]
奇异值分解
[[-0.84399035+0.03548862j -0.1574924 +0.44602345j 0.08723906-0.23466874j]
[ 0.03893388+0.08672055j -0.19156838-0.45118633j -0.02718865-0.86600053j]
[ 0.23121352+0.47320699j -0.71944217+0.13562682j 0.41089761+0.13336765j]] #U
[[-0.63461867+0.j 0.05670247+0.77074248j]
[ 0.77282543+0.j 0.04656219+0.63290822j]] #Vh
[3.55734783 0.7144458 ] #s

SciPy 线性代数的更多相关文章

  1. scipy科学计算库

    特定函数 例贝塞尔函数: 积分 quad,dblquad,tplquad对应单重积分,双重积分,三重积分 from scipy.integrate import quad,dblquad,tplqua ...

  2. SciPy 信号处理

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  3. SciPy 统计

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  4. SciPy 图像处理

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  5. SciPy 优化

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  6. SciPy 积分

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  7. SciPy 插值

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  8. SciPy 输入输出

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  9. SciPy 常量

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

随机推荐

  1. Java面向对象编程 -1.5

    对象引用传递分析 类本身属于引用传递类型,既然是引用传递类型,那么就牵扯到内存的引用传递 所谓的引用传递的本质:同一块堆内存空间可以被不同的栈内存所指向,也可以更换指向. class Person{ ...

  2. 重学Linux - 文件处理命令

    文件处理命令 @auther 张念磊 @date 2020/1/29 touch 命令所在路径:/bin/touch 执行权限:所有用户 语法:touch [filename] 功能描述:创建空文件 ...

  3. SVN 锁定无法提交命令执行失败

    有个项目使用svn 高版本客户端作业,转换到低版本的环境下,出现锁定,命令执行失败. 使用cleanup 没有效果, 网上建议的svn无法Cleanup解决方法: Step1:到 sqlite官网 ( ...

  4. Java入门笔记 03-面向对象(上)

    介绍:Java是面向对象的程序设计语言,类是面向对象的重要内容,可以把类当成是一种自定义类型,可以使用类来定义变量,这种类型的变量统称为引用变量.也就是说,所有类都是引用类型.Java也支持面向对象的 ...

  5. windows下 DEV-C++无法连接到pthread.h的解决办法

    参考的这个博文,原博文有图片:http://lslin.iteye.com/blog/776325 (我只是为了方便写.copy一遍) dev-C++编写C/C++程序时,非常方便轻巧,但是今天学习多 ...

  6. struts标签 解析html标签

    参考:http://blog.csdn.net/shuangrenyu1234/article/details/24527745

  7. va_list、va_start、va_arg、va_end

    转载:https://www.cnblogs.com/bwangel23/p/4700496.html 这几个函数和变量是针对可变参数函数的,什么是可变参数函数呢,最经典的莫过于printf和scan ...

  8. css中class后面跟两个类,这两个类用空格隔开

    css中class后面跟两个类,这两个类用空格隔开,那么这两个类对这个元素都起作用,如果产生冲突,那么后面的类将替代前面的类.

  9. 为什么很多 Android 程序喜欢在存储卡根目录建文件夹来存储数据而不是 Android/data 目录下?

    知乎回答.   http://www.zhihu.com/question/19866689   pansz,欢迎评论 知乎用户.弓长.知乎用户 赞同 这个道理很简单:因为没人管啊.你乱存放文件,在a ...

  10. idea右键新建选项没有类和包的创建方式

    Intelidea创建好项目之后,右键新建Java class的时候发现没有改选项,只有以下几个选项 把sec目录设为源码目录,首先打开Project Structure