Python库之SciPy

工具:Pycharm2019.01,Python3.5

关于ScipyScipy包中有许多工具用来解决科学计算的一些共同问题。不同的子模块负责不同的应用。比如插值、拟合、最优化、图像处理、数值计算以及特殊函数等等。

Scipy中许多模块都是基于numpy的,scipy命名空间中许多主要的函数实际上就是numpy函数比如scipy.cos就是np.cos,故通常一起导入numpy库和scipy库

File input/output: scipy.io

import numpy as np

from scipy import io as siosio.savemat('file_path',{'key',value}) : 将一个用命名和数组的字典保存到matlab样式的.mat文件中。

sio.loadmat('file_path'):导入.mat格式的文件1

2

3

4

5

6

7

8

9

10

11import numpy as np

import matplotlib.pyplot as plt

from scipy import io as sio

a = np.ones((3, 3))

sio.savemat('file.mat',{'a':a}) # 将命名为‘a’的字典保存为.mat格式的文件,默认保存到当前目录下,(.mat)后缀可以不加

data = sio.loadmat('file.mat')

print(data['a'])

- - - - - - - - -

[[1. 1. 1.]

[1. 1. 1.]

[1. 1. 1.]]

Linear algebra operations: scipy.linalg

线形代数运算

import numpy as np

from scipy import linalg1

2

3

4

5

6

7

8

9a=np.array([[1,2],[3,4]])

print(linalg.det(a))  # 求方阵的行列式,要求必须是方阵

print(linalg.inv(a)) # 求逆,必须可逆,否则报错提示奇异(singular不可逆)矩阵

print(np.allclose(np.dot(a,linalg.inv(a)),np.eye(2))) # 判断是否为单位矩阵

- - - - - - - -

-2.0

[[-2. 1. ]

[ 1.5 -0.5]]

True

奇异值分解:

关于奇异值分解:SVD简介1

2

3

4

5import numpy as np

from scipy import linalg

arr = np.arange(9).reshape((3, 3)) + np.diag([1, 0, 1])

print(arr)

uarr, spec, vharr = linalg.svd(arr)  # uarr应该是伪逆

Optimization and fit: scipy.optimize

scipy.optimize提供一种算法来最小化函数值(规模或多维度),曲线拟合和根查找1

2

3import numpy as np

import matplotlib.pyplot as plt

import scipy.optimize as opt

Curve fitting

曲线拟合,这里以sin()曲线为例1

2

3

4

5

6

7

8

9

10def test_func(x, a, b):  # 定义函数

return a * np.sin(b * x)

x_data = np.linspace(-5, 5, num=50)

y_data = 2.9 * np.sin(1.5 * x_data) + np.random.normal(size=50) # sin函数存在偏差

params, params_covariance =opt.curve_fit(test_func, x_data, y_data, p0=[2, 2]) # 求上面函数参数a,b

plt.scatter(x_data,y_data,label='Data')

plt.legend(loc='upper right')

plt.plot(x_data,test_func(x_data,params[0],params[1]),label='fitted function') # 拟合

plt.legend(loc='upper right')

plt.show() # 显示效果如下

Finding the minimum of a scalar function

寻找标量函数最小值。

例如:

下面函数全局最优(小)值为-1.3,而局部最优值大概3.8。

用opt.minimize()函数,需要定义函数f(),以及传入起点坐标x0,返回找到的最小值信息(包括函数值,坐标等)。

为什么说是局部最优呢,当x0=5时,返回的函数值是8.3,位于x=3.83处。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18def f(x):

return x**2 + 10*np.sin(x)

x = np.arange(-10, 10, 0.1)

plt.plot(x, f(x))

plt.show()

result=opt.minimize(f,x0=0) # 寻找局部最小值的x坐标

print(result) # 打印返回结果信息,

- - - - - - - - - - -

fun: -7.945823375615215  # 局部最小值

hess_inv: array([[0.08589237]])

jac: array([-1.1920929e-06])

message: 'Optimization terminated successfully.'

nfev: 18

nit: 5

njev: 6

status: 0

success: True

x: array([-1.30644012])  # 局部最小值的坐标

如果我们不知道全局最优点附近信息也就无法合理选择起点X0了,而opt.basinhopping()函数可以找到全局最优解。将上面opt.minimize(f,x0=0)替换成opt.basinhopping(f,x0)即可,x0还是需要赋初值,经测试当x0=7时找到的是全局最优(-1.3,-7.9),而当x0=5时找到的是局部最优值(3.8,8.3),故为了找到全局最优保险的方法还是需要多试几个参数。

试试opt.minimize_scalar()方法:能找到全局最优解

opt.minimize_scalar()是只有一个变量时的最小函数值,而opt.minimize()是变量作为一个参数向量传进去的。1

2

3

4

5

6

7def f(x):

return x**2 + 10*np.sin(x)

x = np.arange(-10, 10, 0.1)

result=opt.minimize_scalar(f)

print(result.x, result.fun)

- - - - - - - - - - - - - - - -  - - - - -

-1.3064400120612139 -7.945823375615284

Finding the roots of a scalar function

需求:想找到x=?时,f(x)=0。

方法:opt.root(f,x0),x0需要赋初值1

2

3

4

5

6

7

8

9

10def f(x):

return x**2 + 10*np.sin(x)

x = np.arange(-10, 10, 0.1)

root=opt.root(f,x0=-3) # 设置起点,只能找到一个,要找到另外一个需要调参使得x0=1

print(root.x,root.fun)

root=opt.root(f,x0=1)

print(root.x,root.fun)

- - - - - - - - - - - - - - - - -

[-2.47948183] [-1.77635684e-15]

[0.] [0.]

将以上三个函数绘制到一张图中:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43def f(x): # 定义函数

return x**2 + 10*np.sin(x)

x = np.arange(-10, 10, 0.1)

# Global optimization

grid = (-10, 10, 0.1)

xmin_global = opt.brute(f, (grid, )) # 暴力找出参数列表中所得解的最优值

print("Global minima found %s" % xmin_global)

# Constrain optimization

xmin_local = opt.fminbound(f, 0, 10) # 在取区间(0,10)找局部最优解

print("Local minimum found %s" % xmin_local)

root = opt.root(f, 1) # our initial guess is 1

print("First root found %s" % root.x)

root2 = opt.root(f, -2.5)

print("Second root found %s" % root2.x)

fig = plt.figure(figsize=(6, 4)) # 新建画布对象指定size

ax = fig.add_subplot(111) # 将画布分成一行一列指定第一块区域作为对象赋给ax

# Plot the function

ax.plot(x, f(x), 'b-', label="f(x)")

# Plot the minima

xmins = np.array([xmin_global[0], xmin_local])

ax.plot(xmins, f(xmins), 'go', label="Minima")

# Plot the roots

roots = np.array([root.x, root2.x])

ax.plot(roots, f(roots), 'kv', label="Roots")

# Decorate the figure

ax.legend(loc='best') # 自适应选择位置

ax.set_xlabel('x')

ax.set_ylabel('f(x)')

ax.axhline(0, color='gray') # 设置y=0画横线

plt.show()

- - - - - - - - - - - - - - - - - -

Global minima found [-1.30641113]

Local minimum found 3.8374671194983834

First root found [0.]

Second root found [-2.47948183]

未完待续…..

python中的scipy库_SciPy库学习相关推荐

  1. 小结两种在Python中导入C语言扩展库的方法

    小结两种在Python中导入C语言扩展库的方法 分类: Pythoner2009-08-18 20:44 2563人阅读 评论(1) 收藏 举报 python扩展c语言importstring 一种是 ...

  2. 捋一捋Python中的数学运算math库(上篇)

    正式的Python专栏第18篇,同学站住,别错过这个从0开始的文章! 很多学习编程的都多多少少学习了一些数学知识. 学委之前也简单吐槽了 Python中奇葩的round函数! 这篇我们讲讲那些常用的数 ...

  3. linux 下的动态库制作 以及在python 中如何调用 c 函数库

    linux 下的动态库制作 以及在python 中如何调用 c 函数库 动态库: 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序 ...

  4. python中的scipy基础知识_python中SciPy是什么?

    python中Numpy常用于计算二维数组计算,而python的另一个库SciPy库与Numpy有着密切的关系,是需要通过Numpy为基础,同时也是通过Numpy数据来操控科学计算.常见的是插值运算. ...

  5. Python中的TCP的客户端UDP学习----第一篇博客

    Python中的TCP的客户端&UDP学习--第一篇博客 PS: 每日的怼人句子"我真想把我的脑子放到你的身体里,让你感受一下智慧的光芒" 先说UDP流程 发送: 创建套接 ...

  6. python中使用scipy.integrate求积分、二重积分、三重积分

    python中使用scipy.integrate求积分.二重积分.三重积分 代码如下: import numpy as np from scipy.integrate import quad, tpl ...

  7. python 中的 scipy.optimize 最优化功能的一些不足

    python 中的 scipy 也有最优化的功能,体现在里面的 optimize 中,自己简单使用了下,发现它具有以下缺点: 优化算法比较少,有信頼域.单纯形法.BFGS算法等,能够满足不少常规函数的 ...

  8. Python 中最强大的错误重试库

    作者 | 费弗里 来源丨Python大数据分析 1 简介 我们在编写程序尤其是与网络请求相关的程序,如调用web接口.运行网络爬虫等任务时,经常会遇到一些偶然发生的请求失败的状况,这种时候如果我们仅仅 ...

  9. Python 中 xpath 语法 与 lxml 库解析 HTML/XML 和 CSS Selector

    The lxml.etree Tutorial :https://lxml.de/tutorial.html python3 解析 xml:https://www.cnblogs.com/deadwo ...

  10. python中对matlab的支持库

    1. 简介 matplotlib official website:http://matplotlib.sourceforge.net/index.html The pylab mode provid ...

最新文章

  1. LA2678最短子序列
  2. mpython 直接访问_如何从python代码中直接访问Android的Service
  3. Ruby Variable Scope 简单讲解
  4. OpenCV的基本数据结构
  5. 在Linux系统中应用su和sudo
  6. VS2019离线安装方法
  7. 《21天学通C语言》
  8. 【MyEcplise】build workspace卡死
  9. 怎么把word压缩到最小?
  10. 网站木马检测_检测病毒,用这几个网站就够了
  11. 高校如何优雅的使用Ipv6--抱着道长的大腿
  12. 首先,打破一切常规 学习笔记 之二
  13. 微信公众号怎么清缓存
  14. 喜讯 雨笋教育优秀学员荣获望城区网络安全攻防演练二等奖
  15. 杰理之不带功放,隔直推耳机产品【篇】
  16. 运维工程师需要掌握什么技能?有哪些要求?
  17. 光纤软件测试,20m光纤速度怎么测试 20m光纤速度测试方法【详解】
  18. SQL 注入攻击:简介与原理
  19. 概率论与数理统计_陈希儒版_第一章:事件的概率
  20. Waymo二次裁员/特斯拉召回,自动驾驶赛道「新」变化

热门文章

  1. 最新 新生大学JS 阿里巴巴技术专家 精讲JavaScript视频教程
  2. su灯光插件_su各种插件合集
  3. VS2015卸载方法
  4. 博途wincc 与 sql 连接操作(博途V14 wincc advanced)
  5. Matpower建模
  6. 声卡性能测试软件,RightMark Audio Analyzer音频声卡测试软件
  7. LINUX 线程启动回调函数
  8. HMM、MEMM、CRF模型的比较
  9. DB2报错原因汇总(sqlcode sqlstate)
  10. 超火的ipad procreate必备神仙笔刷资源打包下载